我无法在我的 django 项目中从字典中获取值

I can't take value from dictionary in my django project

提问人:Hikmet23 提问时间:11/14/2023 最后编辑:Hikmet23 更新时间:11/16/2023 访问量:84

问:

我有如下所示的字典:

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>
                        

我尝试过的解决方案都没有奏效。

python django 字典 django-models 键值

评论

0赞 willeM_ Van Onsem 11/14/2023
没有故意不用 Django 的模板语言进行下标。您应该在视图中执行此操作。
0赞 willeM_ Van Onsem 11/14/2023
你能分享一下模型吗?person

答:

1赞 Donghyun Lee 11/14/2023 #1

您必须从视图传递上下文数据才能在模板中使用它们。

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>
0赞 willeM_ Van Onsem 11/15/2023 #2

Django 的模板语言不支持下标(即),这是故意这样做的,以防止人们在模板中编写业务逻辑。可以使用Jinja作为模板语言,但这不是必需的,在某种程度上会适得其反,正是为了防止在模板中编写业务逻辑。x[y]

但是,通常根本没有必要。例如,在这种特定情况下,您可以让模式执行映射工作。好消息是,这也会将字段中的字段转换为从该模型派生的 s,例如,在该模型中,它将显示文本,而不是存储在数据库中的数字。<select>ModelFormModelAdmin

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

0赞 nigel222 11/15/2023 #3

如果您确定要在模板中而不是在方法中建立索引,则可以编写一个非常简单的自定义模板标记来执行此操作。在:get_context_datalookup.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 的“自以为是”拒绝在提供的模板设施中允许这样做。 每当我伸手去拿这个时,我都觉得自己就像一个没有锤子的工人爬上梯子,用手上的任何东西轻轻地敲击东西,而不是爬下来拿锤子。

0赞 Hikmet23 11/16/2023 #4

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 %}

评论

0赞 BDL 11/16/2023
这并不能提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 - 来自评论
0赞 Jeremy Caney 11/17/2023
请使用问题中的编辑链接添加其他信息。“发布答案”按钮应仅用于完整回答问题。- 从评论