Django形式与两个不同模型的字段

dea*_*ase 9 forms django django-models django-forms django-crispy-forms

我需要显示一个表单,其中包含来自2个不同模型的多个字段.表单将仅包含模型中的部分字段,并且将使用松散表单进行布局.

我的模特:

class Company(BaseModel):
    title = models.CharField(_('Company'), max_length=128)
    domain = models.CharField(_('Domain'), max_length=128)
class Account(BaseModel):
    company = models.ForeignKey(Company)
    user = models.OneToOneField(User)
    role = models.CharField(_('Role'), choices=ROLES, default='member', max_length=32)
Run Code Online (Sandbox Code Playgroud)

我想在表单中显示的字段:公司标题,用户名,用户姓,用户电子邮件

它甚至可能吗?我怎样才能做到这一点?

And*_*ker 11

此页面上的其他答案涉及抛弃模型表单的好处,并可能需要复制您免费获得的一些功能.

真正的关键是要记住一个html表单!=一个django表单.您可以将多个表单包装在单个html表单标记中.

因此,您只需创建两个模型表单并在模板中进行渲染.Django将处理哪些POST参数属于每个POST参数,除非某些字段名称发生冲突 - 在这种情况下,在实例化时为每个表单赋予唯一的前缀.

形式:

class CompanyForm(forms.ModelForm):
    class Meta:
        fields = [...]
        model = Company

class AccountForm(forms.ModelForm):
    class Meta:
        fields = [...]
        model = Account
Run Code Online (Sandbox Code Playgroud)

视图:

if request.method == 'POST':

    company_form = CompanyForm(request.POST)
    account_form = AccountForm(request.POST)

    if company_form.is_valid() and account_form.is_valid():

        company_form.save()
        account_form.save()
        return HttpResponseRedirect('/success')        

    else:
        context = {
            'company_form': company_form,
            'account_form': account_form,
        }

else:
    context = {
        'company_form': CompanyForm(),
        'account_form': AccountForm(),
    }

return TemplateResponse(request, 'your_template.html', context)
Run Code Online (Sandbox Code Playgroud)

模板:

<form action="." method="POST">
    {% csrf_token %}
    {{ company_form.as_p }}
    {{ account_form.as_p }}
    <button type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

  • @OmarGonzales 为了插入,我们需要分别渲染每个字段(而不是使用类似 `{{company_form.as_p}}` 的东西) (2认同)

zso*_*han 1

在你的 forms.py 中

from django import forms


class YourForm(forms.Form):
    title = forms.CharField()
    first_name = forms.CharField()
    last_name = ...
Run Code Online (Sandbox Code Playgroud)

在你看来.py

from forms import YourForm
from django import views
from models import Company, Account

class YourFormView(views.FormView)
    template_name = 'some_template.html'
    form_class = YourForm
    success_url = '/thanks/'

    def form_valid(self, form):
        title = form.cleaned_data['title']
        ...
        # do your processing here using Company and Account
        # i.e. company = Company.objects.create(title=title, ...)
        #      account = Account.objects.get_or_create(
        #      user=..., company=company ...)
        #      ... more processing
        #
        # Call company.save() and account.save() after adding
        # your processed details to the relevant instances
        #  and return a HttpResponseRedirect(self.success_url)

    def is_valid(self):
        # don't forget to validate your fields if need be here
Run Code Online (Sandbox Code Playgroud)

像往常一样,这些文档非常有帮助。 https://docs.djangoproject.com/en/1.7/topics/forms/