首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调查应用程序forms.py的优化

调查应用程序forms.py的优化
EN

Code Review用户
提问于 2015-06-20 05:41:31
回答 1查看 167关注 0票数 2

这是我正在开发的一个小型调查应用程序的forms.py。我以前发过我的一些models.py。

我完全是自学的,我只是在寻求如何改进的建议。任何建议,即使是你认为应该是显而易见的,都会很感激。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(),}   
EN

回答 1

Code Review用户

发布于 2015-06-20 17:40:15

总体设计

困扰我的一件事是,除非你有不同类型的滑块,否则你可能应该只有一个滑块形式,然后你用在每个不同的滑块上。这将减少代码重复。

我看到这里的一切都是一个ModelForm,它指向Person --有点担心,如果有人不止一次地做一次调查呢?你是否每次填写表格时,都会复制他们的个人资料?如果他们的个人资料在填写表格之间有所改变呢?我想,我会通过建立一个个人信息模型和一个调查回复模型来处理这个问题。然后,调查回复模式将拥有个人信息模型的外键,该模型将负责将一个人与填写的调查相关联。

有其他的方法来解决这个问题,但这是一个简单的方法,我看到你可以用不同的方式来做。

进口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.forms.extras import SelectDateWidget
from django.forms.extras import *

如果您想导入一些东西,您应该显式地执行它们。这样做是阴险的,因为第一行表示您只导入SelectDateWidget,但无论如何您只是导入所有内容。

我会清理这些导入,以便它们在逻辑上分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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表单。

检查无效值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if value is None: value = ''

如果值是None,那么为什么不把它留在那里,并在需要时处理它呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if choices[0][0] == '':

要做到这一点,更重要的是检查是否存在,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if choices[0][0]:

文档字符串

这是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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):

可以成为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) """
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/94180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文