繁体   English   中英

Django 模型中的动态选择字段

[英]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完成了相同的操作。有更好的实现,但这也可以正常工作。 见下面的链接

http://plugins.jquery.com/project/cascade

暂无
暂无

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

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