How to specify Select and RadioSelect in a ModelForm?

巧了我就是萌 提交于 2020-01-02 10:18:28

问题


I am converting a survey from a Form to a ModelForm in Django 1.6.2.

Can anyone tell me what is the equal of forms.ChoiceField(widget=forms.Select(), and forms.ChoiceField(widget=forms.RadioSelect() using ModelForm?

I have tried widget=models.Select() or widget=models.RadioSelect() but it keeps giving the error

AttributeError: 'module' object has no attribute 'Select'

AttributeError: 'module' object has no attribute 'RadioSelect'

Old Code

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)

New Code (not working)

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?')

I have also tried overwriting it in the forms.py as was necessary for SelectDateWidget but did not get it

Any help is as always much appreciated

Thanks


回答1:


Django model doesn’t provide RadioSelect or Select widget. You need to add this in Model form.

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?'
        )


来源:https://stackoverflow.com/questions/30199471/how-to-specify-select-and-radioselect-in-a-modelform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!