django if if choice of choice返回其他选择的值

时间:2013-12-21 09:29:31

标签: django comparison

我的模型类别中有3个字段,主要和辅助。 和2种选择属性和类别。现在我希望自动添加主要内容,具体取决于CATEGORIES选项的值。 我的模型选择和字段

class Skill(models.Model):
    ATTRIBUTES = (
        ('STR', 'Strength'),
        ('DEX', 'Dexterity'),
        ('CON', 'Constitution'),
    )
    CATEGORIES = (            #Primary attribute =
        ('ARCH', 'Archery'),  # Dexterity
        ('ARMO', 'Armor'),    # Constitution
        ('CRAF', 'Crafting'), # Strenght
        ('ELIX', 'Elixers'),  # Constitution
    )
    primary = models.CharField(max_length=3, choices=ATTRIBUTES)    #added automatic
    secundary = models.CharField(max_length=3, choices=ATTRIBUTES)
    category = models.CharField(max_length=4, choices=CATEGORIES)

然后获取Skill object.category

的方法
def get_primary(category):
    if category == 'Archery':
        return ATTRIBUTES[1]

问题是我不知道如何使用我获得表单选择的数据,以及如何发回一个选项以保存在对象中。 有人可以帮帮我吗? 电贺 汉斯

3 个答案:

答案 0 :(得分:1)

ATTRIBUTESCATEGORIES之类的枚举列表是('value', 'verbose_name')元组的列表。 value将写入数据库,verbose_name将显示给用户。因此,要检查为实例分配的类别,您必须使用'value',例如category == 'ARCH'

您可以使用类来引用枚举列表,例如Skill.ATTRIBUTES。如果要分配选项,则必须使用'value'。您可以通过分配字符串(例如self.secondary = 'ELIX')或从枚举中获取字符串来设置它,例如self.secondary = Skill.ATTRIBUTES[-1][0]

最好的方法是定义常量并在任何地方使用它们,如下所示:

ARCHERY = 'ARCH'
ARMOR = 'ARMO'

DEX = 'DEX'

class Skill(models.Model):
    CATEGORIES = (
        (ARCHERY, 'Archery'),
        (ARMOR, 'Armor'),
        ...
    )
    ...

def get_primary(self):
    if category == ARCHERY:
        return DEX

答案 1 :(得分:0)

您可以使用类别和属性关联制作映射dict(如果我理解你的话):

attr_map = {
    'ARCH': 'DEX' # Archery -> Dextrerity
}

并在功能中使用它:

def get_primary():
    #if category == 'Archery':
    #    return ATTRIBUTES[1]
    return attr_map[self.category]

    # or choice tuple if you need it
    return (attr_map[self.category],
            dict(self.ATTRIBUTES).get(attr_map[self.category]))

答案 2 :(得分:0)

如果您有很多类别或稍后可能会添加类别,那么使用正确的Category模型可能是更好的解决方案。它还可以让您更轻松地将类别映射到主要技能:

ATTRIBUTES = (
    ('STR', 'Strength'),
    ('DEX', 'Dexterity'),
    ('CON', 'Constitution'),
)

class Category(models.Model):
    name = models.CharField("name", max_length=32)
    primary = models.CharField("primary", max_length=3, choices=ATTRIBUTES)

class Skill(models.Model):
    category = models.ForeignKey(Categorie)
    @property
    def primary(self):
        return self.category.primary
    secundary = models.CharField(max_length=3, choices=ATTRIBUTES)