standard update - pai-plznw4me/django-initializer GitHub Wiki

ν‘œμ€€ Update κ°€μ΄λ“œ

What?

  • ν‘œμ€€ μˆ˜μ • μΈλ±μŠ€λŠ” Target record 보여주고 μ‚¬μš©μžλ₯Ό 톡해 μˆ˜μ •ν• μˆ˜ μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • ν‘œμ€€ update page λŠ” standard_update() 을 톡해 μƒμ„±λœ μ½”λ“œ 및 HTML 을 μ˜λ―Έν•œλ‹€.
def standard_update(request, id, template_name, model, form_class, redirect_view, redirect_path_variables, base,
                    callback, **callback_kwargs):
    model_inst = model.objects.get(id=id)
    # POST μš”μ²­ 처리
    if request.method == 'POST':
        form = form_class(request.POST, request.FILES, instance=model_inst)  # <-- FILES 와 같이 μž…λ ₯이 λ˜μ–΄μ•Ό ν•œλ‹€.

        # μœ νš¨μ„± 검사 톡과 μ‹œ
        if form.is_valid():
            valid_inst = form.save(commit=False)  # instance load

            # 콜백 ν•¨μˆ˜ 호좜
            if callback:
                callback(request=request, id=id, template_name=template_name, model=model, form_class=form_class,
                         redirect_view=redirect_view, redirect_path_variables=redirect_path_variables, base=base,
                         valid_inst=valid_inst, **callback_kwargs)
            # λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯
            valid_inst.save()  # instance save

            # λ¦¬λ””λ ‰μ…˜
            if redirect_path_variables:  # redirect_path_variables 이 None 이 μ•„λ‹ˆλ©΄
                return redirect(redirect_view, **redirect_path_variables)
            else:
                return redirect(redirect_view)
        # μœ νš¨μ„± 검사 μ‹€νŒ¨ μ‹œ
        else:
            content = render(request, template_name=template_name, context={'form': form}).content
            ret_html = add_content(request, base, content)
            return HttpResponse(ret_html)

    # GET μš”μ²­ 처리
    elif request.method == 'GET':
        added_contents = []
        form = form_class(instance=model_inst)  # <-- FILES 와 같이 μž…λ ₯이 λ˜μ–΄μ•Ό ν•œλ‹€.
        content = render(request, template_name=template_name, context={'form': form}).content.decode('utf-8')
        added_contents.append(content)

        # 콜백 ν•¨μˆ˜ 호좜
        if callback:
            callback(request=request, id=id, template_name=template_name, model=model, form_class=form_class,
                     redirect_view=redirect_view, redirect_path_variables=redirect_path_variables, base=base,
                     added_contents=added_contents, **callback_kwargs)
        # μ΅œμ’… λ Œλ”λ§
        ret_html = add_content(request, base, *added_contents)
        return HttpResponse(ret_html)


속성

  • UpdateForm 을 ν™œμš©ν•΄ Record μΆ”κ°€μ‹œ ν•„μš”ν•œ ν•„λ“œ ν•­λͺ©μ„ κ°€μ Έμ˜¨λ‹€.

  • μΆ”κ°€κ°€ λͺ¨λ‘ λλ‚˜λ©΄ redirect λ₯Ό 톡해 μ‹ ν˜Έλ₯Ό μ†‘μ‹ ν•œλ‹€.

  • callback ν•¨μˆ˜λŠ” GET, POST λͺ¨λ‘ μ‹€ν–‰λœλ‹€.

    if method == 'GET' or method == 'POST' 을 ν†΅ν•΄μ„œ μž‘μ„±

    POST μ—μ„œ callback ν•¨μˆ˜κ°€ μž‘λ™ν•˜λŠ” λ‹¨κ³„λŠ” μœ νš¨μ„± 톡과 이후이닀.

    GET μ—μ„œ callback ν•¨μˆ˜κ°€ μž‘λ™ν•˜λŠ” λ‹¨κ³„λŠ” form render 이후 added_content 에 μΆ”κ°€λœ 이후이닀.

How to use ?

def update(request, id):
    """
    ν”„λ‘œμ νŠΈλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” λ·° ν•¨μˆ˜μž…λ‹ˆλ‹€.

    :param request: HttpRequest 객체
    :param id: ν”„λ‘œμ νŠΈμ˜ μ‹λ³„μž
    :return: HttpResponse 객체
    """
    def _callback(**kwargs):
        if kwargs['request'].method == 'GET':
            title = h_tag(2, 'ν”„λ‘œμ νŠΈ μ—…λ°μ΄νŠΈ')
            kwargs['added_contents'][0] = title + card_row((kwargs['added_contents'][0], 12))

    return standard_update(request, id, 'standard/update.html', Project, ProjectUpdateForm, 'project:index', None,
                           'doctris', _callback)

    
    def projectfile_update(request, id):
    """
    ν”„λ‘œμ νŠΈ μ‚°μΆœλ¬Όμ„ μ—…λ°μ΄νŠΈν•˜λŠ” λ·° ν•¨μˆ˜μž…λ‹ˆλ‹€.

    :param request: HttpRequest 객체
    :param id: μ‚°μΆœλ¬Όμ˜ μ‹λ³„μž
    :return: HttpResponse 객체
    """
    def _callback(**kwargs):
        if kwargs['request'].method == 'POST':
            valid_inst = kwargs['valid_inst']
            redirect_path_variables = kwargs['redirect_path_variables']
            redirect_path_variables['id'] = valid_inst.project_id  # => redirect(project:detail, id=valid_inst.project_id)
        if kwargs['request'].method == 'GET':
            title = h_tag(2, 'μ‚°μΆœλ¬Ό μ—…λ°μ΄νŠΈ')
            kwargs['added_contents'][0] = title + card_row((kwargs['added_contents'][0], 12))

    return standard_update(request, id, 'standard/update.html', ProjectFile, ProjectFileUpdateForm, 'project:detail',
                           {}, 'doctris', _callback)

Callback function

μœ„ κ·Έλ¦Όκ³Ό 같이 callback function 을 ν†΅ν•΄μ„œ μš°λ¦¬λŠ” λ‹€μ–‘ν•œ μž‘μ—…λ“€μ„ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή function μ—μ„œμ˜ callback function 은 λ”±νžˆ μ •ν•΄μ§„ λͺ©μ μ€ μ—†μ§€λ§Œ λŒ€ν‘œμ μœΌλ‘œ 2κ°€μ§€ λͺ©μ μ„ κ°€μ§€κ³  μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. POST 일 λ•Œ, μƒμ„±λœ instance 을 ν™œμš©ν•΄ μž‘μ—…μ„ ν• λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

  2. POST 일 λ•Œ, redirect μ‹œ ν•„μš”ν•œ ν‚€μ›Œλ“œμΈμžλ₯Ό μΆ”κ°€ν• λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  3. GET 일 λ•Œ, content design 을 μž…νžˆκ±°λ‚˜ html 을 μΆ”κ°€ν•˜λŠ” μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    1. 제λͺ© 을 μΆ”κ°€ν•˜λŠ” μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

      title = h_tag(2, 'ν”„λ‘œμ νŠΈ λͺ©λ‘')
      
    2. μœ„ μ˜ˆμ œμ—μ„œλŠ” curd_table_html 에 div class=card 에 curd_table_html 을 μ‚½μž…ν•˜λŠ” μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

      added_contents = kwargs['added_contents']
      added_contents[0] = title + card_row((added_contents[0], 12)
      

⚠️ μΆ”κ°€μ μœΌλ‘œ added_contents 에 μΆ”κ°€λœ μžλ£ŒλŠ” μˆœμ„œλŒ€λ‘œ 화면에 λžœλ”λ§ λ©λ‹ˆλ‹€.