正确的方法将`forms.ChoiceField`重写为ModelField?它是models.ForeignKey?

时间:2015-05-12 14:52:25

标签: django python-2.7 django-models django-forms

我正在将调查从Form转换为Django 1.6.2中的ModelForm,但我在为ChoiceField选择正确的字段类型时遇到问题。调查是使用SessionWizardView实现的。

我的问题是:使用ModelForm将以下代码重写到我的models.py中的正确方法是什么?

旧代码:

forms.py

class SurveyFormA(forms.Form):

    MALE = 'M'
    FEMALE = 'F'

    SEX = (
        ("", "----------"), 
        (MALE, "Male"),
        (FEMALE, "Female"),
               )   
    sex = forms.ChoiceField(widget=forms.Select(), choices=SEX, initial= "", label='What sex are you?', required = False)

以下是我的尝试,但是通过阅读除了ChoiceField之外的每个模型字段列出相应表单字段的documentation,我并非100%确定我是正确的。

新代码:

forms.py

class SurveyFormA(forms.ModelForm):

    class Meta:
        model = Person
        fields = ['sex']

models.py

class Person(models.Model):

    MALE = 'M'
    FEMALE = 'F'

    SEX = (
        (MALE, "Male"),
        (FEMALE, "Female"))   

    sex = models.ForeignKey('Person', related_name='Person_sex', null=True, choices=SEX, verbose_name='What sex are you?')

这是对的吗?

1 个答案:

答案 0 :(得分:0)

不,这不正确。看看Django's choices documentation

替换你的行

sex = models.ForeignKey('Person', related_name='Person_sex',
                        null=True, choices=SEX, verbose_name='What sex are you?')

sex = models.CharField(max_length=1, choices=SEX,
                       verbose_name='What sex are you?', null=True)

存储在数据库中的值将是" F"或" M",但Django将展示"女性"或者"男性"在ModelForm中。对此here有一个很好的解释。