簡體   English   中英

Django 最佳實踐。 形式

[英]Django best practice. Forms

我有一個與 django 中的表單相關的問題(我是新手)看。 在這里,我的表格如下所示:

class ProccessAgentForm(forms.Form):
    agent_id = forms.HiddenInput()
    main_name = forms.IntegerField()
    company_name = forms.CharField(max_length=60)
    company_state = forms.CharField(max_length=60)
    company_city = forms.CharField(max_length=60)
    company_country = forms.CharField(max_length=60)
    company_post_code = forms.IntegerField()
    agent_first_name = forms.CharField(max_length=60)
    agent_last_name = forms.CharField(max_length=60)
    agent_phone = forms.CharField(max_length=60)
    agent_fax = forms.CharField(max_length=60)
    agent_email = forms.EmailField()
    agent_city = forms.CharField(max_length=60)
    agent_post_code = forms.IntegerField()
    agent_state = forms.CharField(max_length=60)
    agent_country = forms.CharField(max_length=60)
    signer_first_name = forms.CharField(max_length=60)
    signer_last_name = forms.CharField(max_length=60)
    signer_title = forms.CharField(max_length=60)

我像這樣解析它(我知道這不是最好的選擇):

form = ProccessAgentForm(request.POST)
    if form.is_valid():
        ....
    designated_company = DesignatedCompany()
    designated_company.pdf_link = copyright_agent.pdf_link
    designated_company.name = request.POST['company_name']
    designated_company.address = company_address
    designated_company.city = request.POST['company_city']
    designated_company.post_code = request.POST['company_post_code']
    designated_company.state = request.POST['company_state']
    designated_company.country = request.POST['company_country']
    designated_company.save()

    agent = DesignatedAgent()
    agent.company = designated_company
    agent.first_name = request.POST['agent_first_name']
    agent.last_name = request.POST['agent_last_name']
    agent.email = request.POST['agent_email']
    agent.address = agent_address
    agent.city = request.POST['agent_city']
    agent.country = request.POST['agent_country']
    agent.post_code = request.POST['agent_post_code']
    agent.state = request.POST['agent_state']
    agent.fax = request.POST['agent_fax']
    agent.phone = request.POST['agent_phone']
    agent.save()

等等......我怎樣才能使它更具可讀性? 我應該將邏輯拆分為表單嗎? 我知道模型表單,但這里我有你看到的外鍵。 我很感激更詳細的回復:)

我怎樣才能使它更具可讀性?

首先,您可以通過使用表單的cleaned_data而不是request.POST來使其更安全——它將包含清理、清理和最終正確鍵入的值,而不是請求正文中的原始字符串。

有點不相關,但當我們在做的時候:郵政編碼(郵政編碼)不是整數,它是一個字符串(根據國家/地區的不同,最終僅包含數字字符)。

然后你可以使用objects.create()並直接傳遞你的數據,而不是創建一個空白模型實例,手動分配所有屬性然后保存它:

data = form.cleaned_data
designated_company = DesignatedCompany.objects.create(
    pdf_link=copyright_agent.pdf_link,
    name=data['company_name'],
    address=company_address,
    city=data['company_city'],
    # etc
    )

最后:只需使用一對ModelForms

我應該將邏輯拆分為表單嗎?

答案就在問題中。

我知道模型表單,但這里我有你看到的外鍵。

和 ? 怎么會有問題? 從 ModelForm 中排除您現在不需要/不能使用的字段,並在保存第二個表單時使用commit=False標志,以便您可以自己添加缺少的部分。

您甚至可以在您自己的“類似表單”的類(該類不繼承自Form但具有相同的 API - 至少是您感興趣的部分 - 並委托給您的CompanyForm 和 AgentForm),所以視圖的代碼不必打擾......

您可以使用ModelForm自動生成在保存時創建模型實例的表單,如下所示:

class DesignatedCompanyForm(ModelForm):
     class Meta:
         model = DesignatedCompany
         fields = ['name', 'city', 'post_code', 'state', 'country']

還有不需要單獨表單的CreateView

class DesignatedCompanyCreate(CreateView):
    model = DesignatedCompany
    fields = ['name', 'city', 'post_code', 'state', 'country']

(片段未經測試,可能需要一些修復)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM