我的模型.py:
SHOP1_CHOICES = (
('Food Court', 'Food Court'),
('KFC', 'KFC'),
)
SHOP2_CHOICES = (
('Sports Arena', 'Sports Arena'),
('Disco D', 'Disco D'),
)
SHOP3_CHOICES = (
('Bowling Arena', 'Bowling Arena'),
('Cinemax', 'Cinemax'),
)
class Feed(models.Model):
gender = models.CharField(max_length=5, choices=GENDER_CHOICES, default='girl')
name =models.CharField(max_length=25)
shop=models.CharField(max_length=20)
location=models.CharField(max_length=25, choices=SHOP1_CHOICES)
这里如果
Feed.shop == 'shop1'
我想在SHOP1_CHOICES
上加载Feed.location
。目前无论哪家商店,都只显示SHOP1_CHOICES
(没什么奇怪的)。我该如何实现呢?我被困住了,请帮忙。
来自 Django 文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#choices
最后,请注意,选择可以是任何可迭代对象——不一定是列表或元组。这使您可以动态地构建选择。但是,如果您发现自己的黑客选择是动态的,那么您最好使用带有外键的正确数据库表。选择适用于不会发生太大变化(如果有的话)的静态数据。
Django 5.0 添加了对接受映射或可调用而不是可迭代的支持,并且不再要求直接使用 .choices 来扩展枚举类型:
def get_scores():
return [(i, str(i)) for i in range(10)]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal) # Using `.choices` not required.
sport = models.CharField(..., choices=SPORT_CHOICES)
score = models.IntegerField(choices=get_scores) # A callable is allowed.
这是我的方法:
我使用lazy来进行延迟加载:
from django.utils.functional import lazy
这里有一个选择选项的助手:
def help_SHOP_CHOICES():
SHOP1_CHOICES = [
('Food Court', 'Food Court'),
('KFC', 'KFC'),
]
SHOP3_CHOICES = [
('Bowling Arena', 'Bowling Arena'),
('Cinemax', 'Cinemax'),
]
return random.choice( SHOP1_CHOICES + SHOP3_CHOICES ) # choose one
最后是动态选择的模型:
class Feed(models.Model):
...
location=models.CharField(max_length=25, choices=SHOP1_CHOICES)
def __init__(self, *args, **kwargs):
super(Feed, self).__init__(*args, **kwargs)
self._meta.get_field('location').choices = \
lazy(help_SHOP_CHOICES,list)()
我认为你不应该在模型上这样做,形式是一个更好的地方。或者你应该重新考虑你的模型。例如:
class Location(models.Model):
pass
class Shop(models.Model):
location = models.ForeignKey(Location)
class Feed(models.Model):
shop = models.ForeignKey()