2011-09-20 86 views
0

我没有一个例子,因为我没有在任何有关工作的权利,但我还是好奇,阅读有关表单集的文档后:Django的形式质疑

什么是一个最佳实践有具有多个不同模型表单的同一时间发布的单一视图(相当于1个组合表单,因为您不能同时发布多个表单,但由于缺少更好的解释......),有些是单一模型表单,以及其他的一个或多个表单集(例如,Person,他的1 Address,以及他的1个或多个Pet对象),就像Django用TabularInline所做的那样。内线一直在Django有一段时间,所以我的怀疑是,有比我可以通过简单地复制/粘贴admin/options.py中的内容更好的做法,不是吗?

在此先感谢

回答

2

你应该:

  • 确保您使用的交易(因此,要确保他们打开,并且您正在使用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, 
    }) 

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

+0

感谢您的回答。值得注意的是formset的'prefix'参数(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-more-than-one-formset-in-a-view) 。 – orokusaki