这是我正在开发的一个小型调查应用程序的forms.py。我以前发过我的一些models.py。
我完全是自学的,我只是在寻求如何改进的建议。任何建议,即使是你认为应该是显而易见的,都会很感激。
from django import forms
from django.forms import ModelForm, Textarea, extras, RadioSelect, IntegerField
from django.forms.extras import SelectDateWidget
from django.forms.extras import *
from survey.models import Person
from django.core import validators
import random
from django.forms.util import ErrorList
from itertools import chain
from django.utils.encoding import force_unicode
# Used to make RadioSelect non manditory and remove default option in the ModelForm
# (http://stackoverflow.com/questions/30218930/how-to-make-a-radioselect-non-manditory-and-remove-default-option-in-a-modelform)
class RadioSelectNotNull(RadioSelect):
def get_renderer(self, name, value, attrs=None, choices=()):
"""Returns an instance of the renderer."""
if value is None: value = ''
str_value = force_unicode(value) # Normalize to string.
final_attrs = self.build_attrs(attrs)
choices = list(chain(self.choices, choices))
if choices[0][0] == '':
choices.pop(0)
return self.renderer(name, str_value, final_attrs, choices)
class SurveyFormIT1(forms.ModelForm):
class Meta:
model = Person
fields = ['instruction_task_one_value']
widgets = {'instruction_task_one_value' : forms.HiddenInput}
class SurveyFormIT2(forms.ModelForm):
class Meta:
model = Person
fields = ['instruction_task_two_value']
widgets = {'instruction_task_two_value' : forms.HiddenInput}
class Start(forms.ModelForm):
class Meta:
model = Person
fields = ['start']
widgets = {'start' : forms.HiddenInput}
class SurveyFormA(forms.ModelForm):
birthdate = forms.DateField(widget=extras.SelectDateWidget(), required=False)
class Meta:
model = Person
fields = ['sender', 'birthdate', 'sex', 'marital_status', 'state']
class SurveyFormB(forms.ModelForm):
class Meta:
model = Person
fields = ['internet_usage', 'smart_phone_ownership', 'smart_phone_usage']
widgets = {'internet_usage' : RadioSelectNotNull,
'smart_phone_ownership' : RadioSelectNotNull,
'smart_phone_usage' : RadioSelectNotNull,}
class SurveyFormC(forms.ModelForm):
class Meta:
model = Person
fields = ['education', 'wages', 'presentage_savings', 'occupation', 'living']
widgets = {'education' : RadioSelect(),
'wages' : RadioSelect(),
'presentage_savings' : RadioSelect(),
'occupation' : RadioSelect(),
'living' : RadioSelect(),}
class SurveyFormD(forms.ModelForm): # Political Viewpoints
class Meta:
model = Person
fields = ['political_leaning', 'democrat_republican', 'voting_rights', 'election']
widgets = {'political_leaning' : RadioSelect(),
'democrat_republican' : RadioSelect(),
'voting_rights' : RadioSelect(),
'election' : forms.CheckboxSelectMultiple,}
class SurveyFormE(forms.ModelForm): #News Access Questions
class Meta:
model = Person
fields = ['news_access', 'station_access', 'newspaper_access']
widgets = {'news_access' : forms.CheckboxSelectMultiple,
'station_access' : forms.CheckboxSelectMultiple,
'newspaper_access' : forms.CheckboxSelectMultiple,}
class SurveyFormSpike1(forms.ModelForm):
class Meta:
model = Person
fields = ['spike_one_value']
widgets = {'spike_one_value' : forms.HiddenInput}
class SurveyFormF1(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_one_value']
widgets = {'slider_one_value' : forms.HiddenInput}
class SurveyFormF2(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_two_value']
widgets = {'slider_two_value' : forms.HiddenInput}
class SurveyFormF3(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_three_value']
widgets = {'slider_three_value' : forms.HiddenInput}
class SurveyFormDV1(forms.ModelForm):
class Meta:
model = Person
fields = ['DV_one_value', 'DV_two_value', 'DV_three_value']
widgets = {'DV_one_value' : forms.HiddenInput,
'DV_two_value' : forms.HiddenInput,
'DV_three_value' : forms.HiddenInput}
class SurveyFormF4(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_four_value']
widgets = {'slider_four_value' : forms.HiddenInput}
class SurveyFormF5(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_five_value']
widgets = {'slider_five_value' : forms.HiddenInput}
class SurveyFormF6(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_six_value']
widgets = {'slider_six_value' : forms.HiddenInput}
class SurveyFormDV2(forms.ModelForm):
class Meta:
model = Person
fields = ['DV_four_value', 'DV_five_value', 'DV_six_value']
widgets = {'DV_four_value' : forms.HiddenInput,
'DV_five_value' : forms.HiddenInput,
'DV_six_value' : forms.HiddenInput}
class SurveyFormSpike2(forms.ModelForm):
class Meta:
model = Person
fields = ['spike_two_value']
widgets = {'spike_two_value' : forms.HiddenInput}
class SurveyFormF7(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_seven_value']
widgets = {'slider_seven_value' : forms.HiddenInput}
class SurveyFormF8(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_eight_value']
widgets = {'slider_eight_value' : forms.HiddenInput}
class SurveyFormF9(forms.ModelForm):
class Meta:
model = Person
fields = ['slider_nine_value']
widgets = {'slider_nine_value' : forms.HiddenInput}
class SurveyFormDV3(forms.ModelForm):
class Meta:
model = Person
fields = ['DV_seven_value', 'DV_eight_value', 'DV_nine_value']
widgets = {'DV_seven_value' : forms.HiddenInput,
'DV_eight_value' : forms.HiddenInput,
'DV_nine_value' : forms.HiddenInput}
class SurveyFormDV4(forms.ModelForm):
class Meta:
model = Person
fields = ['DV_positive']
widgets = {'DV_positive' : forms.HiddenInput}
class SurveyFormDV5(forms.ModelForm):
class Meta:
model = Person
fields = ['DV_negative']
widgets = {'DV_negative' : forms.HiddenInput}
class SurveyFormG(forms.ModelForm): #Reflective Questions
class Meta:
model = Person
fields = ['medium', 'gender', 'political', 'racial', 'climate_change', 'health_care', 'religious', 'party_benefit', 'party_benefit_message']
widgets = {'medium' : RadioSelect(),
'gender' : RadioSelect(),
'political' : RadioSelect(),
'racial' : RadioSelect(),
'climate_change' : RadioSelect(),
'health_care' : RadioSelect(),
'religious' : RadioSelect(),
'party_benefit' : RadioSelect(),
'party_benefit_message' : forms.Textarea}
class SurveyFormH(forms.ModelForm): #Reflective Questions
class Meta:
model = Person
fields = ['topics', 'topics_message', 'website_aspects', 'deliberate', 'deliberate_message']
widgets = {'topics' : forms.CheckboxSelectMultiple,
'topics_message' : forms.Textarea,
'website_aspects' : forms.CheckboxSelectMultiple,
'deliberate' : RadioSelect(),
'deliberate_message' : forms.Textarea}
class SurveyFormI(forms.ModelForm):
class Meta:
model = Person
fields = ['medium', 'branding', 'agenda', 'share_buttons', 'agreement_share_buttons', 'elements_features', 'elements_features_message', 'limit_elements_features', 'limit_elements_features_message']
widgets = {'medium' : RadioSelect(),
'branding' : RadioSelect(),
'agenda' : RadioSelect(),
'share_buttons' : RadioSelect(),
'agreement_share_buttons' : RadioSelect(),
'elements_features' : RadioSelect(),
'elements_features_message' : forms.Textarea,
'limit_elements_features' : RadioSelect(),
'limit_elements_features_message' : forms.Textarea,}
class SurveyFormJ(forms.ModelForm):
class Meta:
model = Person
fields = ['bias_action', 'bias_action_message', 'bias_stop_reading']
widgets = {'bias_action' : RadioSelect(),
'bias_action_message' : forms.Textarea,
'bias_stop_reading' : RadioSelect(),}
发布于 2015-06-20 17:40:15
困扰我的一件事是,除非你有不同类型的滑块,否则你可能应该只有一个滑块形式,然后你用在每个不同的滑块上。这将减少代码重复。
我看到这里的一切都是一个ModelForm
,它指向Person
--有点担心,如果有人不止一次地做一次调查呢?你是否每次填写表格时,都会复制他们的个人资料?如果他们的个人资料在填写表格之间有所改变呢?我想,我会通过建立一个个人信息模型和一个调查回复模型来处理这个问题。然后,调查回复模式将拥有个人信息模型的外键,该模型将负责将一个人与填写的调查相关联。
有其他的方法来解决这个问题,但这是一个简单的方法,我看到你可以用不同的方式来做。
from django.forms.extras import SelectDateWidget
from django.forms.extras import *
如果您想导入一些东西,您应该显式地执行它们。这样做是阴险的,因为第一行表示您只导入SelectDateWidget
,但无论如何您只是导入所有内容。
我会清理这些导入,以便它们在逻辑上分组:
from django.core import validators
from django.forms.extras import SelectDateWidget
from django.forms.util import ErrorList
from django import forms
from django.utils.encoding import force_unicode
from survey.models import Person
from itertools import chain
import random
注意我是如何用from django.forms import ModelForm, Textarea, extras, RadioSelect, IntegerField
删除行的。选择一个重要的风格,并坚持它。你有像forms.ModelForm
之类的东西,但接着是RadioSelect
。为什么不让这个forms.RadioSelect
保持一致,然后根据惯例我们就知道RadioSelect
来自Django表单。
if value is None: value = ''
如果值是None
,那么为什么不把它留在那里,并在需要时处理它呢?
if choices[0][0] == '':
要做到这一点,更重要的是检查是否存在,如下所示:
if choices[0][0]:
这是:
# Used to make RadioSelect non manditory and remove default option in the ModelForm
# (http://stackoverflow.com/questions/30218930/how-to-make-a-radioselect-non-manditory-and-remove-default-option-in-a-modelform)
class RadioSelectNotNull(RadioSelect):
可以成为:
class RadioSelectNotNull(RadioSelect):
"""Used to make RadioSelect non mandatory and remove default option in the ModelForm.
See (http://stackoverflow.com/questions/30218930/how-to-make-a-radioselect-non-manditory-and-remove-default-option-in-a-modelform) """
https://codereview.stackexchange.com/questions/94180
复制相似问题