Django形成了问题

时间:2011-09-20 15:25:46

标签: python django django-forms

我没有一个例子,因为我现在没有处理任何相关的事情,但在阅读有关formset的文档后仍然很好奇:

最佳做法是将单个视图与多个不同的模型表单同时发布(而不是一个组合表单,因为您不能同时发布多个表单,但由于缺乏更好的解释...),有些是单一的模型形式,有些是1或更多的形式集(例如Person,他的1 Address和他的1或更多{{ 1}}}}},就像Django和Pet一样。内联已经在Django中使用了一段时间,所以我怀疑是通过简单地复制/粘贴TabularInline中的内容,有没有更好的实践,没有?

提前致谢

1 个答案:

答案 0 :(得分:2)

你应该:

  • 确保您正在使用事务(因此,请确保它们已打开,并且您使用的是MySQLAM表以外的其他内容)。这一直是真的,但是现在更是如此。 :)

  • 使用多个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,
    })

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