【问题标题】:In Django, remove options in a choice-field based on other fields in a model在 Django 中,根据模型中的其他字段删除选择字段中的选项
【发布时间】:2016-11-03 00:09:18
【问题描述】:

我是 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)

【问题讨论】:

    标签: python django dynamic django-models choicefield


    【解决方案1】:

    您可以在清理表单时从 django 表单中执行此操作,或者您也可以通过 javascript 进行操作以从前端删除该选项

    【讨论】:

    • 我的计划是在 django 表单中执行检查。
    【解决方案2】:

    除非您编写一套规则,否则您无法做到这一点,维护起来确实很复杂。
    这里最好的解决方案是对食物使用单独的模型,并将外键添加到动物模型中:

    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()
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 2014-08-17
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2014-03-20
      • 2019-04-15
      相关资源
      最近更新 更多