8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在Django中处理一个页面上的多个表单的正确方法

kmdreko 2月前

64 0

我有一个模板页面需要两个表单。如果我只使用一个表单,那么一切正常,如以下典型示例所示:if request.method == 'POST': form = AuthorForm(request.POST,) if form.is_va...

我有一个模板页面需要两个表单。如果我只使用一个表单,那么一切就都正常了,如以下典型示例所示:

if request.method == 'POST':
    form = AuthorForm(request.POST,)
    if form.is_valid():
        form.save()
        # do something.
else:
    form = AuthorForm()

但是,如果我想使用多个表单,我该如何让视图知道我只提交其中一个表单而不是另一个表单(即它仍然是 request.POST 但我只想处理发生提交的表单)?


这是 基于答案的解决方案,其中 expectedphrase bannedphrase 是不同表单的提交按钮的名称,而 expectedphraseform bannedphraseform 是表单。

if request.method == 'POST':
    if 'bannedphrase' in request.POST:
        bannedphraseform = BannedPhraseForm(request.POST, prefix='banned')
        if bannedphraseform.is_valid():
            bannedphraseform.save()
        expectedphraseform = ExpectedPhraseForm(prefix='expected')
    elif 'expectedphrase' in request.POST:
        expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected')
        if expectedphraseform.is_valid():
            expectedphraseform.save() 
        bannedphraseform = BannedPhraseForm(prefix='banned')
else:
    bannedphraseform = BannedPhraseForm(prefix='banned')
    expectedphraseform = ExpectedPhraseForm(prefix='expected')
帖子版权声明 1、本帖标题:在Django中处理一个页面上的多个表单的正确方法
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由kmdreko在本站《forms》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我需要在同一页面上独立验证的多个表单。我遗漏的关键概念是 1) 使用表单前缀作为提交按钮名称和 2) 无界表单不会触发验证。如果它对其他人有帮助,以下是我使用 TemplateView 的两个表单 AForm 和 BForm 的简化示例,基于 @adam-nelson 和 @daniel-sokolowski 的回答以及 @zeraien 的评论( https://.com/a/17303480/2680349 ):

    # views.py
    def _get_form(request, formcls, prefix):
        data = request.POST if prefix in request.POST else None
        return formcls(data, prefix=prefix)
    
    class MyView(TemplateView):
        template_name = 'mytemplate.html'
    
        def get(self, request, *args, **kwargs):
            return self.render_to_response({'aform': AForm(prefix='aform_pre'), 'bform': BForm(prefix='bform_pre')})
    
        def post(self, request, *args, **kwargs):
            aform = _get_form(request, AForm, 'aform_pre')
            bform = _get_form(request, BForm, 'bform_pre')
            if aform.is_bound and aform.is_valid():
                # Process aform and render response
            elif bform.is_bound and bform.is_valid():
                # Process bform and render response
            return self.render_to_response({'aform': aform, 'bform': bform})
    
    # mytemplate.html
    <form action="" method="post">
        {% csrf_token %}
        {{ aform.as_p }}
        <input type="submit" name="{{aform.prefix}}" value="Submit" />
        {{ bform.as_p }}
        <input type="submit" name="{{bform.prefix}}" value="Submit" />
    </form>
    
返回
作者最近主题: