【问题标题】:Django forms "pattern" for this situation?Django为这种情况形成“模式”?
【发布时间】:2013-08-07 18:04:16
【问题描述】:

我对 Python 很陌生,所以这可能是一个愚蠢的问题,但我还是会问它。对于这种常见的视图情况,是否有 Django 表单“设计模式”?当我运行视图时,我希望它根据填写表单的用户类型对两种不同类型的表单之一进行操作。在 if request.method 块中有两个 if/then 块来确定我正在处理的表单类型似乎很难看。我想要的是能够引用“CreateProfileForm”,它将引用 CreateManProfileForm 或 CreateWomanProfileForm,具体取决于会话变量中的内容。

谢谢!

def create_profile(request, template):

    if request.session['user_type_cd'] == 'man':
        is_man = True
    else:
        is_man = False

    if request.method == "POST":
        if is_man:
            form = CreateManProfileForm(request.POST)
        else:
            form = CreateWomanProfileForm(request.POST)
        if form.is_valid():
            # Do stuff
            return HttpResponseRedirect(reverse('do-next-thing'))
    else:
        if is_man:
            form = CreateManProfileForm()
        else:
            form = CreateWomanProfileForm()

    return render_to_response(template, locals(), context_instance=RequestContext(request))

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    你可以这样做:

    创建一个表格字典,

    FORMS = {
        0: CreateWomanProfileForm,
        1: CreateManProfileForm
    }
    

    在视图中:

    def create_profile(request, template):
        is_man = 1 if request.session.get('user_type_cd') == 'man' else 0
    
        if request.method == "POST":
            form = FORMS.get(is_man)(request.POST)
            if form.is_valid():
                # Do stuff
                return HttpResponseRedirect(reverse('do-next-thing'))
        else:
            form = FORMS.get(is_man)()
    
        return render_to_response(template, locals(), context_instance=RequestContext(request))
    

    甚至这应该可以工作

    def create_profile(request, template):
        is_man = 1 if request.session['user_type_cd'] == 'man' else 0
    
        form = FORMS.get(is_man)(request.POST or None)
        if request.method == "POST":
            if form.is_valid():
                # Do stuff
                return HttpResponseRedirect(reverse('do-next-thing'))
    
        return render_to_response(template, locals(), context_instance=RequestContext(request))
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2019-08-01
      • 2011-09-28
      相关资源
      最近更新 更多