Python 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)

我有一个关于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)
我对它进行了如下分析(我知道这不是最好的选择):


等等。。。如何使它更具可读性?我应该将逻辑拆分为形式吗?我知道模型表单,但这里我有外键,正如您所看到的。如果您能提供更详细的答复,我将不胜感激:)

您可以使用它自动生成表单,在保存时创建模型实例,如下所示:

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
    )