如何在ModelForm中指定Select和RadioSelect?

时间:2015-05-12 19:06:56

标签: django django-models django-forms

我正在将调查从Form转换为Django 1.6.2中的ModelForm

任何人都可以使用forms.ChoiceField(widget=forms.Select(),告诉我forms.ChoiceField(widget=forms.RadioSelect()ModelForm的等值是什么吗?

我已尝试过widget=models.Select()widget=models.RadioSelect(),但它一直在提出错误

  

AttributeError:'module'对象没有属性'Select'

     

AttributeError:'module'对象没有属性'RadioSelect'

旧代码

forms.py

class SurveyFormB(forms.Form): 

    #Do you own a Smartphone?   
    YES_SMARTPHONE = 'Yes'
    NO_SMARTPHONE = 'No'    

    SMART_PHONE_OWNERSHIP = (
        (YES_SMARTPHONE, 'Yes'),
        (NO_SMARTPHONE, 'No'),
               )    
    smart_phone_ownership = forms.ChoiceField(widget=forms.RadioSelect(), choices=SMART_PHONE_OWNERSHIP, initial= "", label='Do you own a Smartphone?', required = False)


    #If 'Yes' How many hours a day do you access the Internet on it?
    SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY = 'Less than one hour  day'
    SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY = '1 - 2 Hours a day'
    SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY = '2 - 4 hours a day'
    SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY = '4 - 6 hours a day'
    SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY = '6 - 8 hours a day'
    SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY = '8 + hours a day'


    SMART_PHONE_USAGE = (
        ("", "----------"),
        (SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY, 'Less than one hour a day'),
        (SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY, '1 - 2 Hours a day'),
        (SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY, '2 - 4 hours a day'),
        (SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY, '4 - 6 hours a Day'),
        (SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY, '6 - 8 hours a day'),
        (SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY, '8 + hours a day'),
               )

    smart_phone_usage = forms.ChoiceField(widget=forms.Select(), choices=SMART_PHONE_USAGE, initial= "", label='If Yes, How many hours a day do you access the Internet on it?', required = False)

新规范(不工作)

modules.py

#Do you own a Smartphone?   
    YES_SMARTPHONE = 'Yes'
    NO_SMARTPHONE = 'No'


    SMART_PHONE_OWNERSHIP = (
        (YES_SMARTPHONE, 'Yes'),
        (NO_SMARTPHONE, 'No'),
               )    
    smart_phone_ownership = models.CharField(null=True, max_length=1, widget=models.RadioSelect(), choices=SMART_PHONE_OWNERSHIP, verbose_name='Do you own a Smartphone?')



#If 'Yes' How many hours a day do you access the Internet on it?
    SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY = 'Less than one hour  day'
    SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY = '1 - 2 Hours a day'
    SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY = '2 - 4 hours a day'
    SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY = '4 - 6 hours a day'
    SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY = '6 - 8 hours a day'
    SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY = '8 + hours a day'


    SMART_PHONE_USAGE = (
        (SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY, 'Less than one hour a day'),
        (SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY, '1 - 2 Hours a day'),
        (SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY, '2 - 4 hours a day'),
        (SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY, '4 - 6 hours a Day'),
        (SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY, '6 - 8 hours a day'),
        (SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY, '8 + hours a day'),
               )

    smart_phone_usage = models.CharField(null=True, blank=True, max_length=1, widget=models.Select(), choices=SMART_PHONE_USAGE, verbose_name='If Yes, How many hours a day do you access the Internet on it?')

我还试图在forms.py覆盖SelectDateWidget,但是没有得到它

任何帮助都一如既往地受到赞赏

由于

1 个答案:

答案 0 :(得分:5)

Django模型不提供RadioSelect或Select小部件。您需要以模型形式添加它。

forms.py

class SmartPhoneForm(forms.ModelForm):
    class Meta:
        model = Phone
        fields = ['smart_phone_ownership', 'smart_phone_usage']
        widgets = {
            'smart_phone_ownership': forms.RadioSelect,
            'smart_phone_usage': forms.Select,
        }

models.py

class SmartPhone(models.Model):
    # Do you own a Smartphone?
    YES_SMARTPHONE = 'Yes'
    NO_SMARTPHONE = 'No'


    SMART_PHONE_OWNERSHIP = (
        (YES_SMARTPHONE, 'Yes'),
        (NO_SMARTPHONE, 'No'),
               )    
    smart_phone_ownership = models.CharField(
        null=True, max_length=1,
        default=None, 
        choices=SMART_PHONE_OWNERSHIP, verbose_name='Do you own a Smartphone?')



#If 'Yes' How many hours a day do you access the Internet on it?
    SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY = 'Less than one hour  day'
    SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY = '1 - 2 Hours a day'
    SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY = '2 - 4 hours a day'
    SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY = '4 - 6 hours a day'
    SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY = '6 - 8 hours a day'
    SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY = '8 + hours a day'


    SMART_PHONE_USAGE = (
        (SMART_PHONE_LESS_THAN_ONE_HOUR_A_DAY, 'Less than one hour a day'),
        (SMART_PHONE_ONE_TO_TWO_HOURS_A_DAY, '1 - 2 Hours a day'),
        (SMART_PHONE_TWO_TO_FOUR_HOURS_A_DAY, '2 - 4 hours a day'),
        (SMART_PHONE_FOUR_TO_SIX_HOURS_A_DAY, '4 - 6 hours a Day'),
        (SMART_PHONE_SIX_TO_EIGHT_HOURS_A_DAY, '6 - 8 hours a day'),
        (SMART_PHONE_EIGHT_PLUS_HOURS_A_DAY, '8 + hours a day'),
               )

    smart_phone_usage = models.CharField(
        null=True, blank=True, max_length=1,
        choices=SMART_PHONE_USAGE,
        # default=None,
        verbose_name='If Yes, How many hours a day do you access the Internet on it?'
        )