Python Django最佳实践。形式
我有一个关于django中表单的问题(我是新手) 看这里我有一个表格,看起来像:Python Django最佳实践。形式,python,django,Python,Django,我有一个关于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)
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)
我对它进行了如下分析(我知道这不是最好的选择):
等等。。。如何使它更具可读性?我应该将逻辑拆分为形式吗?我知道模型表单,但这里我有外键,正如您所看到的。如果您能提供更详细的答复,我将不胜感激:)您可以使用它自动生成表单,在保存时创建模型实例,如下所示:
class DesignatedCompanyForm(ModelForm):
class Meta:
model = DesignatedCompany
fields = ['name', 'city', 'post_code', 'state', 'country']
还有一种不需要单独形式的:
class DesignatedCompanyCreate(CreateView):
model = DesignatedCompany
fields = ['name', 'city', 'post_code', 'state', 'country']
(代码片段未经测试,可能需要一些修复)
如何使它更具可读性
首先,您可以使用表单的cleaned_data
而不是request.POST
——它将包含经过清理、消毒并最终正确键入的值,而不是请求正文中的原始字符串,从而使其更安全
有点不相关,但当我们这样做时:邮政编码(zip代码)不是整数,而是字符串(最终只包含数字字符,具体取决于国家)
然后,您可以使用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
我应该将逻辑拆分为形式吗 答案在问题中 我知道模型表单,但这里我有外键,正如您所看到的 然后呢?这怎么会是个问题?从模型表单中排除您现在不想要/不能使用的字段,并在保存第二个表单时使用
commit=False
标志,以便您可以自己添加缺少的部分
您甚至可以将这两个表单和所有这些内部工作在您自己的“类似表单”的类中进行外观设计(该类不属于
form
,但具有相同的API—至少是您感兴趣的部分—以及对公司表单和代理表单的委托),这样视图的代码就不必麻烦了……我应该将逻辑拆分为表单吗?答案在问题中。对不起,我的英语不好,这是一个分裂逻辑的肯定吗?@Manza,确实是。作为一个一般性的指导原则,尽量保持视图的沉默,并尽可能地将业务逻辑转移到分离实体(模型、表单、普通的python类等)上。依赖于request
对象的代码对于unittest来说是一个难题,并且不能在请求/响应周期之外重用,因此依赖于请求的代码越少越好。django表单将类dict
对象作为数据
,而不是完整的请求,这是一个原因,ModelForm
封装了创建/更新模型实例的整个逻辑。
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
)