[英]Dynamic choices field in Django Models
我的models.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)
这里 if Feed.shop == 'shop1'
我想在SHOP1_CHOICES
上加载Feed.location
。 目前不管是什么商店,它只显示SHOP1_CHOICES
(毫不奇怪)。我该如何实现? 我卡住了,请帮忙。
这是我的方法:
我使用 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)()
来自 Django 文档:http ://docs.djangoproject.com/en/dev/ref/models/fields/#choices
最后,请注意选择可以是任何可迭代对象——不一定是列表或元组。 这使您可以动态构建选择。 但是,如果您发现自己的黑客选择是动态的,那么最好使用带有外键的正确数据库表。 选择适用于不会发生太大变化的静态数据,如果有的话。
我不认为你应该在模型上这样做,形式是一个更好的地方。 或者你应该重新考虑你的模型。 例如:
class Location(models.Model):
pass
class Shop(models.Model):
location = models.ForeignKey(Location)
class Feed(models.Model):
shop = models.ForeignKey()
您需要使用一些Ajax功能。 我不知道在标准的django管理界面中你可以在哪里做到这一点而不会破坏管理CSS,模板等。
我建议您使用某种级联库,使用ModelForms在您自己的自定义视图中实现此功能。
在一些情况下,我已经使用jquery插件Cascade完成了相同的操作。有更好的实现,但这也可以正常工作。 见下面的链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.