【问题标题】:Django choices and dictionaryDjango 选择和字典
【发布时间】:2016-10-19 22:38:43
【问题描述】:

我有代码

JOBS = 1
CATEGORY_CHOICES = ((JOBS, "Jobs"),)

以及模型中的代码

category = models.IntegerField(choices=CATEGORY_CHOICES, default=JOBS)

我想添加字典并在模板中访问它,而不是“工作”。例如

JOBS = 1
CATEGORY_CHOICES = ((JOBS, {'title':"Jobs",'icon':"fa fa-briefcase",'slug':"jobs"}),)

但我得到以下内容

如何将字典添加到选项中? 我能够创建一个模型,该模型将被设置:标题和图标。但相反,我决定创造一个选择。标题我可以加,但要为选中的项目设置图标?

【问题讨论】:

  • 是什么意思`JOBS=1`
  • 明确你想做什么
  • @HishamKaram 我能够创建一个模型,该模型将被设置:标题和图标。但相反,我决定创造一个选择。标题我可以加,但要为选中的项目设置图标?
  • 如果你想做出选择,例如使用tuple(x for x in zip(range(10),string.ascii_letters))会产生类似((0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'))的东西
  • @HishamKaram 我创建了我的元组。就在上面的例子中,只有一种选择。我的问题是我想添加一个字段

标签: python django dictionary


【解决方案1】:

我会发表评论,但遗憾的是没有足够的代表。设置IntegerField的方式,显示字典值并返回字典键。

您似乎想要做的是让该键确定其他几个值的结果。然后你应该做的是在你提交表单的任何视图中,根据你的 IntegerField 返回的键设置其他值。

换句话说:

CATEGORY_CHOICES = ((1, 'Jobs'),(2, 'Cities'),)

然后在这个表单提交到的类或视图中:

if CATEGORY_CHOICES  == 1:
    title = 'Jobs'
    icon = 'fa fa-briefcase'
    slug = 'jobs'
elif CATEGORY_CHOICES == 2:
    title = 'Cities'
`   icon = 'fa fa-city'
    slug = 'cities'

【讨论】:

  • 嗨,格雷格,请不要将答案用作 cmets。如果您对该问题有潜在的解决方案,请修改您的答案。
  • 我想我给出了一个解决方案,稍后使用key设置参数。不过你给了一个更好的。
  • @GregSchmit 谢谢。我别无选择,只能使用这种依赖。
  • 没问题,但我必须赞扬 Soviut,因为它在严谨性方面提供了客观上更好的答案。我的方式有点老套。
【解决方案2】:

Django 模型中的选择是 (key, value) 元组。关键是保存时要存储在模型字段中的内容,而值是作为选项显示的内容。您不能简单地将字典塞入值中。

例如,以下选项会将human 存储在数据库中,并在选择字段中显示Humans

species = [
    ('human', 'Humans'),
    ('reptile', 'Reptiles'),
    ('cylons', 'Aliens'),
]

相反,您需要重新构建数据模型。您应该创建一个单独的 Category 模型来表示包含 slug、图标和标题字段的选项。

class Category(models.Model):
    slug  = models.SlugField()
    title = models.CharField()
    icon  = models.CharField()

然后使用ForeignKey() 将当前模型指向Category 模型。

class MyModel(models.Model):
    category = models.ForeignKey(Category)

最后,您可以在呈现表单时使用ModelChoiceField 将相关类别模型(跨外键相关)呈现为列表中的选项。如果您使用ModelForm,默认情况下所有外键都将表示为ModelChoiceFields。

【讨论】:

  • 但是如果我想要:(key, {"key": "value", "key": value}) ?
  • 你不能。我只是解释了一下。这不是关系数据库的工作方式。
  • 感谢您的回复。我想在数据库之外创建一个列表,但需要更多字段。我会考虑如何以不同的方式实现它。
  • @alexander 你没有提供任何你想这样做的理由。为什么要打破一个行之有效的既定惯例?
  • 因为有一个艰难的选择。要么那个,要么那个。使用数据库是没有意义的。
【解决方案3】:

您可以使用Choices 类形式django_model_helpers 应用程序。 https://github.com/rewardz/django_model_helpers

CATEGORY_CHOICES = Choices(
     {"jobs": {'id': 1, 'display': 'Jobs', 'icon':"fa fa-briefcase",'slug':"jobs"}
)

然后在你的模型中

category = models.IntegerField(choices=CATEGORY_CHOICES(), default=CATEGORY_CHOICES.jobs)

现在从代码访问图标:

icon = CATEGORY_CHOICES.get_value(my_inst.category, "icon")
slug = CATEGORY_CHOICES.get_value(my_inst.category, "slug")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2014-08-15
    • 2010-11-19
    • 2017-10-16
    相关资源
    最近更新 更多