3

我需要顯示一個窗體,其中包含來自2個不同模型的多個字段。 表單將只包含模型中的部分字段,並使用鬆脆形式進行佈局。Django窗體與來自兩個不同模型的字段

我的模型:

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) 

領域,我想在形式展現: 的公司名稱,用戶名,用戶姓名,用戶電子郵件

它甚至有可能?我怎樣才能做到這一點?

+0

可以同時通過在視圖 – Kakar 2015-01-15 16:43:45

+1

形式手動進行的形式。 '類MyCustomForm(forms.Form)'。您可以在其中包含您想要的任何字段,而不限於數據模型。 – 2015-01-15 18:46:36

+0

@Kakar離這裏最近。本頁面上的其他答案涉及丟棄使用ModelForms的好處。雖然這有時是最好的方法 - 它可能更多'Djangonic'來創建兩個模型表單(它們被呈現爲一個HTML表單) - 我會盡快寫出一個正確的答案。 – 2016-12-20 17:59:55

回答

1

在你forms.py

from django import forms 


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

在你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 

像往常一樣,文檔是非常有益的。 https://docs.djangoproject.com/en/1.7/topics/forms/

4

此頁面上的其他答案涉及扔掉模型表格的好處,並可能需要複製一些免費獲得的功能。

真正的關鍵是要記住一個html表單!=一個django表單。您可以將多個表單包裝在一個HTML表單標籤中。

因此,您可以創建兩個模型窗體並在模板中渲染它們。 Django將處理哪些POST參數屬於每個參數,除非某些字段名稱發生衝突 - 在這種情況下,當您實例化每個表單時,請爲每個表單指定一個唯一的前綴。

形式:

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

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

查看:

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) 

模板:

<form action="." method="POST"> 
    {% csrf_token %} 
    {{ company_form.as_p }} 
    {{ account_form.as_p }} 
    <button type="submit"> 
</form> 
+0

+1爲你清晰的答案。這是Django做事的方式。唯一的問題是你不能插入來自不同模型的字段。我很感激,如果你可以擴展如何在模板渲染中插入來自不同模型的字段。 – 2017-11-23 16:34:44

相關問題