提问人:Hikmet23 提问时间:11/14/2023 最后编辑:Hikmet23 更新时间:11/16/2023 访问量:84
我无法在我的 django 项目中从字典中获取值
I can't take value from dictionary in my django project
问:
我有如下所示的字典:
duties = {
1 : 'Crew',
2 : 'Cast',
3 : 'Director',
4 : 'Writers',
}`
{% with index=person.duty_type %}
<div class="small text-gray-500">{{duties.index}}</div>
{% endwith %}
我从字典中选择的特殊值不会显示在站点中。
我也试着这样写:
<div class="small text-gray-500">{{duties.person.duty_type}}</div>
我尝试过的解决方案都没有奏效。
答:
您必须从视图传递上下文数据才能在模板中使用它们。
class SampleListView(ListView):
...
def get_context_data(self, **kwargs):
context = super(SampleListView, self).get_context_data(**kwargs)
# you should modify following dict
context["data_you_want_to_use"] = {
1 : 'Crew',
2 : 'Cast',
3 : 'Director',
4 : 'Writers',
}
return context
...
然后,您可以在模板中使用“data_you_want_to_use”,如下所示。
<div>
{% for key, data in data_you_want_to_use.items %}
{{ data }}
{% endfor %}
</div>
Django 的模板语言不支持下标(即),这是故意这样做的,以防止人们在模板中编写业务逻辑。可以使用Jinja作为模板语言,但这不是必需的,在某种程度上会适得其反,正是为了防止在模板中编写业务逻辑。x[y]
但是,通常根本没有必要。例如,在这种特定情况下,您可以让模式执行映射工作。好消息是,这也会将字段中的字段转换为从该模型派生的 s,例如,在该模型中,它将显示文本,而不是存储在数据库中的数字。<select>
ModelForm
ModelAdmin
DUTIES = (
(1, 'Crew'),
(2, 'Cast'),
(3, 'Director'),
(4, 'Writers'),
)
class Person(models.Model):
duty_type = models.IntegerField(choices=DUTIES)
# …
然后在模板中,我们可以将其呈现为:
{{ person.get_duty_type_display }}
在这种特定情况下,没有太多变化:您可以使用:
{% for person in people_details %}
<div class="small text-gray-500">{{person.get_duty_type_display }}</div>
{% endfor %}
完全没有必要将 传递给模板。duties
如果您确定要在模板中而不是在方法中建立索引,则可以编写一个非常简单的自定义模板标记来执行此操作。在:get_context_data
lookup.py
@register.filter
def lookup( d, key):
""" filter: d is dict-like. return d[key] with '' as default using get method """
return d.get( key, '')
和在模板中
{% load lookup %}
...
... {{duties|lookup:'index'}} ...
(我仍然没有决定我是否同意 Django 的“自以为是”拒绝在提供的模板设施中允许这样做。 每当我伸手去拿这个时,我都觉得自己就像一个没有锤子的工人爬上梯子,用手上的任何东西轻轻地敲击东西,而不是爬下来拿锤子。
Thanks for your answers, but i wanted to take specific indexes.
class Movie_Model(models.Model):
person_name = models.ManyToManyField(Person)
class Person(models.Model):
duty_types = (
(1, 'Crew'),
(2, 'Cast'),
(3, 'Director'),
(4, 'Writers'),
)
name = models.CharField(max_length = 100, default = 'Not Given')
duty_type = models.IntegerField('Duty', choices = duty_types)
我已经在 Person 模型和我的主类之间建立了 ManyToManyField 连接。我只想采用主模型中存在的值。
我的 views.py 如下图所示:
def movie_details(request, slug):
slug_data = get_object_or_404(Movie_Model, slug = slug)
duties = {
1 : 'Crew',
2 : 'Cast',
3 : 'Director',
4 : 'Writers',
}
return render(request, 'movie_details.html', {
'slug_data' : slug_data,
'people_details' : slug_data.person_name.all(),
'duties' : duties,
})
html文件是:
{% for person in people_details %}
{% with index=person.duty_type %}
<div class="small text-gray-500">{{duties.index}}</div>
{% endwith %}
{% endfor %}
评论
person