[英]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.