2017-02-08 2 views
1

У меня есть вопрос, связанный с формами в 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() 

и так далее ... Как я могу сделать его более удобным для чтения ? Должен ли я разделить логику на формы? Я знаю о модели Forms, но здесь у меня есть внешние ключи, как вы видели. Я был бы признателен за более подробный ответ :)

ответ

2

Как я могу сделать его более читаемым?

Сначала вы можете сделать его более безопасным с помощью вашей формы cleaned_data вместо request.POST - он будет содержать очищен, продезинфицировать, и в конце концов правильно набрал значение вместо исходных строк из тела запроса.

Немного несвязанный, но пока мы на нем: почтовый индекс (почтовый индекс) НЕ является целым числом, это строка (в конечном итоге содержащая только числовые символы в зависимости от страны).

Тогда вы могли бы использовать objects.create() и передавать данные напрямую вместо создания экземпляра пустой модели, назначая все атрибуты вручную, а затем сохранить его: данные = form.cleaned_data designated_company = DesignatedCompany.objects.create ( pdf_link = copyright_agent.pdf_link, имя = данные [ 'company_name'], адрес = company_address, город = данные [ 'company_city'], # т.д. )

И, наконец, просто использовать пару ModelForms вместо этого.

Должен ли я разделить логику на формы?

Ответ на вопрос.

Я знаю о моделях форм, но здесь у меня есть внешние ключи, как вы видели.

И? Как это проблема? Исключить поля, которые вы не хотите/не можете использовать сейчас из ModelForm, и использовать флаг commit=False при сохранении второй формы, чтобы вы могли самостоятельно добавлять недостающие части.

Вы можете даже обойти обе формы и всю эту внутреннюю работу в собственном классе, подобном «форме» (класс, который не наследуется от Form, но имеет тот же API - по крайней мере, интересующие вас части - и делегаты вашей компанииForm и AgentForm), поэтому код представления не нужно беспокоиться ...

+0

Большое вам спасибо! :) Я буду работать над этим –

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

(фрагменты не тестируется, некоторые исправления могут быть необходимы)