Django form with fields from two different models

后端 未结 2 1891
忘了有多久
忘了有多久 2020-12-30 07:32

I need to display one form, with multiple fields from 2 different models. Form will contain only part of fields from models, and layout will be made using the crispy forms.<

相关标签:
2条回答
  • 2020-12-30 08:16

    The other answers on this page involve tossing away the benefits of model forms and possibly needing to duplicate some of the functionality you get for free.

    The real key is to remember that one html form != one django form. You can have multiple forms wrapped in a single html form tag.

    So you can just create two model forms and render them both in your template. Django will handle working out which POST parameters belong to each unless some field names clash - in which case give each form a unique prefix when you instantiate it.

    Forms:

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

    View:

    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)
    

    Template:

    <form action="." method="POST">
        {% csrf_token %}
        {{ company_form.as_p }}
        {{ account_form.as_p }}
        <button type="submit">
    </form>
    
    0 讨论(0)
  • 2020-12-30 08:22

    In your forms.py

    from django import forms
    
    
    class YourForm(forms.Form):
        title = forms.CharField()
        first_name = forms.CharField()
        last_name = ...
    

    In your views.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
    

    As usual the docs are pretty helpful. https://docs.djangoproject.com/en/1.7/topics/forms/

    0 讨论(0)
提交回复
热议问题