Django条件选择

2024-05-14 06:03:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django的新手,一直在一个项目中工作,在这个项目中,我尝试将依赖于bool值的选项字段附加到当前用户。我在模型里有这个

user = models.OneToOneField(user_model, on_delete=models.CASCADE)
####
I_CAT = models.BooleanField(default=False)
I_DOG = models.BooleanField(default=False)
I_PAW = models.BooleanField(default=False)

I_OPTIONS = [
    [('star'), ('Star')],
    When(I_CAT=True, then=Value([('cat'), ('Cat')])),
]



icon = models.TextField(choices=I_OPTIONS, default='star')

我希望有它,这样当当前用户的值I\u CAT设置为True时,它会将该选项添加到我们的选项列表中,该列表用作图标的选项列表。我真的不知道最好的方法。我曾尝试在模型文件本身和本页的视图中使用When和if语句。我还没找到工作,最近我找到的就是这个

if I_CAT:
    I_OPTIONS.append([('cat'), ('Cat')])

它成功地向选项列表中添加了一些内容,但实际上并不检查I\u CAT是否为真,而是每次都添加它,不管发生什么。我还在另一篇文章中读到,如果模型中的语句是个坏主意,那么idk。任何指导都将不胜感激!你知道吗

编辑: 我按照Brobin的建议将此代码添加到表单中。我必须添加一个额外的if语句,以防止每次刷新页面时都重新添加该选项。一切都按计划进行了!你知道吗

    def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    cat = [('cat'), ('Cat')]
    dog = [('dog'), ('Dog')] 
    paw = [('paw'), ('Paw')]
    choices = [
        [('star'), ('Star')],
    ]
    if self.instance.I_CAT:
        if cat not in choices:
            choices.append(cat)
    if self.instance.I_DOG:
        if dog not in choices:
            choices.append(dog)
    if self.instance.I_PAW:
        if paw not in choices:
            choices.append(paw)
    self.fields['icon'].choices = choices  

icon = forms.ChoiceField(required=True)

Tags: 模型selffalsedefault列表ifmodels选项
1条回答
网友
1楼 · 发布于 2024-05-14 06:03:03

我会重新考虑模型,以便表单是动态的,并且基于查询。像这样的。这有一个额外的好处,即不需要为新图标添加更多布尔值。你知道吗

class Icon(models.Model):
    code = models.CharField(max_length=16)
    name = models.CharField(max_length=16)


class Profile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    icons_unlocked = models.ManyToManyField(Icon)
    icon = mdoels.ForeignKey(Icon)

然后在表单中,可以根据用户可用的内容设置字段的queryset选项。你知道吗


class IconSelectForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['icon'].queryset = self.instance.icons_unlocked.all()

    class Meta:
        model = Profile
        fields = ['icon']

如果你不想改变模型,你可以用你的布尔函数做类似的事情

class IconSelectForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        choices = []
        if self.instance.I_CAT:
            choices.append(('cat', 'Cat'))
        self.fields['icon'].choices = choices

    class Meta:
        model = Profile
        fields = ['icon']

相关问题 更多 >