繁体   English   中英

在Django中,根据模型中的其他字段删除选项字段中的选项

[英]In Django, remove options in a choice-field based on other fields in a model

我是Django的新手,感谢任何帮助,如何根据前一个字段限制一个字段中的选项。 例如,如果我为动物选择'狗',我想从FOOD_CHOICE中删除'巧克力',因为我爱狗。 谢谢!!!

ANIMAL_CHOICE = (
     ('a','cat'),
     ('b','dog'),
     ('c','fish'),
)
FOOD_CHOICE = (
      ('a', 'chocolate'),
      ('b', 'kittySnack'),
      ('c', 'steak'),
)


class Animal(models.Model):
    animal = models.CharField(max_length=1, choices= ANIMAL_CHOICE)
    food   = models.CharField(max_length=1, choices= FOOD_CHOICE)

当你清理表单时,你会从django表单中做到这一点,或者你也可以通过javascript操作从前端删除该选项

除非您编写一组规则,否则您无法执行此操作,这些规则实际上很难维护。
这里最好的解决方案是使用单独的食物模型,并将外键添加到动物模型中:

ANIMAL_CHOICE = (
     ('a','cat'),
     ('b','dog'),
     ('c','fish'),
)
FOOD_CHOICE = (
      ('a', 'chocolate'),
      ('b', 'kittySnack'),
      ('c', 'steak'),
)


class Animal(models.Model):
    animal = models.CharField(max_length=1, choices= ANIMAL_CHOICE)
    foods   = models.ManyToManyField(Food)

class Food(models.Model):
    food   = models.CharField(max_length=1, choices= FOOD_CHOICE)

另一方面,您应该保证每个动物入口都是唯一的,每个食物记录都是相同的。 这样可以避免重复。
现在,使用此处的选项限制了解决方案并使其硬编码,如果您想要包含新动物或新食物,则需要更改代码。

建议

class Animal(models.Model):
        name = models.CharField(max_length=50, unique=True)
        description = models.TextField()
        foods   = models.ManyToManyField(Food)

class Food(models.Model):
        name   = models.CharField(max_length=50, unique=True)
        description = models.TextField()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM