Django中如何定义表单模型?ChoiceField?

qyswt5oh  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(127)

我制作了一个表单,其中包含如下字段:

sex = forms.ChoiceField(choices= SEX)

其中:

SEX = (
    ('F','Female'),
    ('M','Male'),
    ('U','Unsure'),
    )

现在我想知道该如何最好地定义模型中的性场?我知道可以这样做:

class UserProfile(models.Model):
    user = models.ForeignKey('User')
    sex = models.CharField(max_length=10)

但难道没有比查菲尔德更好的选择吗

uz75evzq

uz75evzq1#

您已经将选项设置为字符串,因此它在模型中应该是CharField(max_length=1, choices=SEX)。然后,您可以使用ModelForm,而不是在单独的表单中重复所有逻辑。例如:

# models.py
class MyModel(models.Model):
    SEX_CHOICES = (
        ('F', 'Female',),
        ('M', 'Male',),
        ('U', 'Unsure',),
    )
    sex = models.CharField(
        max_length=1,
        choices=SEX_CHOICES,
    )

# forms.py
class MyForm(forms.MyForm):
    class Meta:
        model = MyModel
        fields = ['sex',]
ee7vknir

ee7vknir2#

自 Django 4月4日起

现在有一个更合适的方法来做这件事。看看吧。基本上,你需要创建一个枚举类,就像

class SexOptions(models.TextChoices):
    FEMALE = 'F', 'Female'
    MALE = 'M', 'Male'
    UNSURE = 'U', 'Unsure'

class UserProfile(models.Model):
    user = models.ForeignKey('User')
    sex = models.CharField(max_length=1, choices=SexOptions.choices)

旧答案

class UserProfile(models.Model):
    SEX_FEMALE = 'F'
    SEX_MALE = 'M'
    SEX_UNSURE = 'U'

    SEX_OPTIONS = (
        (SEX_FEMALE, 'Female'),
        (SEX_MALE, 'Male'),
        (SEX_UNSURE, 'Unsure')
    )
    user = models.ForeignKey('User')
    sex = models.CharField(max_length=1, choices=SEX_OPTIONS)

我更喜欢这种方式,它更容易在代码中引用选项。

UserProfile.objects.filter(sex__exact=UserProfile.SEX_UNSURE)

相关问题