【问题标题】:Django forms questionDjango表单问题
【发布时间】:2011-09-20 15:25:46
【问题描述】:

我没有示例,因为我现在没有从事任何相关的工作,但在阅读了有关表单集的文档后,我仍然很好奇:

什么是一个最佳实践,让单个视图具有多个同时发布的不同模型表单(而不是 1 个组合表单,因为您不能同时发布多个表单,但由于缺乏更好的解释...),一些是单一模型形式,而另一些是 1 个或多个表单集(例如 Person、他的 1 个 Address 和他的 1 个或多个 Pet 对象),就像 Django 对TabularInline 所做的那样。内联在 Django 中已经存在了一段时间,所以我怀疑有比我通过简单地复制/粘贴 admin/options.py 中的内容可能找到的更好的做法,不是吗?

提前致谢

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    你应该:

    • 确保您正在使用事务(因此,请确保它们已打开,并且您使用的不是 MySQL 和 MyISAM 表)。这一直是真的,真的,但现在更是如此。 :)

    • 使用多个 forms.Form/forms.ModelForm 对象,这些对象组合在一个 HTML <form> 元素中,例如...

    Python:

    from django import forms
    
    class FormA(forms.ModelForm):
        [...]
    
    class FormB(forms.ModelForm):
        [...]
    

    HTML:

    <form method="post" action="/path/to/view/">
        {% csrf_token %}
    
        {{ form_a }}
        {{ form_b }}
    
        <input type="submit" value="Submit Form" />
    </form>
    

    然后,当您处理表单时,只需同时处理它们并确保您要求两者都有效以在成功案例中实际完成视图。

    from django.db import transaction
    from django.http import HttpResponseRedirect
    from django.template.response import TemplateResponse
    from myapp.forms import FormA, FormB
    
    @transaction.commit_on_success
    def present_forms_to_user(request):
        if request.method == 'POST':
            form_a = FormA(request.POST)
            form_b = FormB(request.POST)
    
            if form_a.is_valid() and form_b.is_valid():
                # processing code
    
                return HttpResponseRedirect('/path/to/thank/you/page/')
        else:
            form_a = FormA()
            form_b = FormB()
    
        return TemplateResponse(request, 'templates/eggs.html', {
            'form_a': form_a,
            'form_b': form_b,
        })
    

    作为免责声明,请记住,这是一个基本的示例存根,不能盲目复制。您的最终用例可能会略有不同,这很好。

    【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多