我有一个与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()
依旧......我怎样才能让它更具可读性?我应该将逻辑拆分为表格吗?我知道模型表单,但在这里我有你看到的外键。我感谢您提供更详细的回复:)
答案 0 :(得分:2)
如何让它更具可读性?
首先,您可以使用表单的cleaned_data
代替request.POST
使其更安全 - 它将包含已清理,已清理且最终正确键入的值,而不是请求正文中的原始字符串。< / p>
有点无关但我们在它时:邮政编码(邮政编码)不是整数,它是一个字符串(最终只包含数字字符,具体取决于国家)。
然后您可以使用objects.create()
直接传递数据,而不是创建空白模型实例,手动分配所有属性然后保存它:
data = form.cleaned_data
designated_company = DesignatedCompany.objects.create(
pdf_link = copyright_agent.pdf_link,
名=数据[ 'COMPANY_NAME'],
地址= company_address,
城市=数据[ 'company_city'],
#etc.
)
最后:只需使用一对ModelForms
。
我应该将逻辑拆分为表格吗?
答案就在问题中。
我知道模型表单,但是在这里我有你看到的外键。
而且?这怎么回事?从ModelForm中排除您不想/不能使用的字段,并在保存第二个表单时使用commit=False
标志,以便您自己添加缺少的部分。
你甚至可以在两个表格和所有这些内部工作中使用你自己的“类似形式”的类(一个不从Form
继承但具有相同API的类 - 至少部分你的感兴趣 - 并委托你的CompanyForm和AgentForm)所以视图的代码不必费心......
答案 1 :(得分:1)
您可以使用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']
(片段未经过测试,可能需要修补一些)