我是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)
我会重新考虑模型,以便表单是动态的,并且基于查询。像这样的。这有一个额外的好处,即不需要为新图标添加更多布尔值。你知道吗
然后在表单中,可以根据用户可用的内容设置字段的queryset选项。你知道吗
如果你不想改变模型,你可以用你的布尔函数做类似的事情
相关问题 更多 >
编程相关推荐