Django最佳实践。形式

时间:2017-02-08 14:58:20

标签: 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)
    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()

依旧......我怎样才能让它更具可读性?我应该将逻辑拆分为表格吗?我知道模型表单,但在这里我有你看到的外键。我感谢您提供更详细的回复:)

2 个答案:

答案 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']

(片段未经过测试,可能需要修补一些)