如何在django模板中读取传递过去的字典参数中的某一项?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在django模板中读取传递过去的字典参数中的某一项?相关的知识,希望对你有一定的参考价值。

网上关于模板中使用字典都是说的循环读取,我这里说的不是循环读取。

往页面传递一个参数:

content = 'genders' :
'male' : u'男',
'female' : u'女',



页面是这样输出的:

% for customer in customers %
customer.name 是 customer.gender 性客户<br/>
% endfor %

customer 对象中的 gender 属性用的是英文
这里该怎么通过访问 genders 字典改成输出中文呢?

* 说明:不讨论设计是否合理,只是作为一个小例子。
* 如果有更好的方式传参也可以一并说明。

两个方法:
1. 你可以用翻译文件 % trans ,这样就不需要去取genders了
2. 可以增加一个filter,参考这里: https://code.djangoproject.com/ticket/3371
参考技术A   django 模板直接遍历字典就可以实现;
  参考例子:
  方法一:
  t = Template('% for key, value in dict.items % key ===> value \n% endfor %')
  t.render(c)
  方法二:
  t = Template('% for key in dict.items % key.0 ===> key.1 \n% endfor %')
  t.render(c)

如何正确地将多个参数(来自模板/上下文)传递给 Django 中的视图?

【中文标题】如何正确地将多个参数(来自模板/上下文)传递给 Django 中的视图?【英文标题】:How do I correctly pass multiple arguments (from the template/context) to a view in Django? 【发布时间】:2018-09-27 21:24:44 【问题描述】:

我对 Django 比较陌生(v=2.1)。几天以来,我一直在寻找解决这个问题的方法,我认为这很容易,但是尽管在这里和其他地方阅读了很多帖子,但还没有设法解决它。 我有两个模型:教师和作业。非常简单:

models.py    

class Teacher(models.Model):
    name = models.CharField(max_length=200)

class Assignment(models.Model):
    title = models.CharField(max_length=200)
    teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True)

我有一个(工作的)网站,上面有老师 nr 的作业列表。我使用通用 DetailView 函数生成的 x,其中一些代码如下所示:

assignments_list.html

% for assignment in teacher.assignment_set.all %
    ...
    <a href="% url 'assignment-detail' pk1=assignment.teacher.pk pk2=assignment.pk %">assignment.title</a>
    ...
% endfor %

当我单击 assignment.title 时,我想获取该特定教师作业的详细信息页面。 我使用这个 url conf:

urls.py

urlpatterns += [path('teacher/<int:pk1>/assignment/<int:pk2>/', views.AssignmentDetailView.as_view(), name = 'assignment-detail')]

我使用这个视图功能(我尝试了几个变种):

views.py

from .models import Teacher, Assignment
from django.views import generic

class AssignmentDetailView(generic.DetailView):
    model = Assignment
    template_name = 'assignment_detail.html'

    def get_queryset(self, **kwargs):
        queryset = super(AssignmentDetailView, self).get_queryset()
        return queryset.filter(teacher_id=self.kwargs['pk1'], pk=self.kwargs['pk2'])

我正在尝试传递页面上下文中的两个参数(pk1 和 pk2)(包含分配列表)。 如果我单击链接 (assignment.title),我确实会看到一个带有正确数字 pk1 和 pk2 的 url(我在 url 地址栏中看到它,例如http://localhost:8000/teacher/2/assignment/4)。但是没有显示页面。通过调整一些东西,我得到了不同的错误:

语法错误、缺少参数的问题...目前已解决。 “查询集未检索到任何对象”(或类似措辞)。 当前错误:“视图 app.views.AssignmentDetailView 未返回 HttpResponse 对象。而是返回 None。'

我的问题:

    我做错了什么?我正确通过了吗?或者是问题在 我的观点?... 如何传递论点(教师 pk 和作业 pk) 从模板(或者,简单地说,上下文?)到视图函数?和 如何使用它们从我的模型中返回正确的对象? 每次调用视图函数时是否必须传递参数? 参数自动从一个视图(模板)传递到另一个? 最初我将通过 URL 传递参数,但后来我想不通过 URL 传递它们:我还能使用模板吗 参数,但仅在视图中使用它们(不在 url 中)?这是 怎么走?

非常感谢您的建议。

【问题讨论】:

我没有看到您的视图中定义了 get(self,request,teacher,assignment) 方法。您可能需要定义一个。 @RedCricket 在 CBV 中不需要。 查询 Assignment.objects.filter(teacher_id=someid, pk=somepk) 在 Python 控制台中有效吗? “最初我会通过 URL 传递参数,但后来我想在不通过 URL 的情况下传递它们”。这不是 django 架构或一般网络应用程序的基本工作方式。服务器(django)在 client(浏览器)呈现的 html 中发送响应。从它你向 server (django) 发出请求,使用 urls。请记住,对于纯 html,与服务器通信的唯一方法是使用 url。 您是否覆盖了AssignmentDetailView 中的任何其他方法?如果是这样,请向我们展示这些。同时发布错误的完整堆栈跟踪。 【参考方案1】:

非常感谢大家的快速回复(我没想到!)如果我没有对所有 cmets 做出反应,我很抱歉,但我感谢每一个帮助。

我再次对其进行了研究,现在了解到 queryset 返回一个集合而不是单个模型实例(我最好使用“get”)。我进行了如下更改,现在它可以工作了:

assignments_list.html

<a href="% url 'assignment-detail' pk=assignment.teacher.pk pk1=assignment.pk %">


views.py

class AssignmentDetailView(generic.DetailView):
    model = Assignment
    template_name = 'assignment_detail.html'

def get_object(self, **kwargs):
    assignment = Assignment.objects.get(id=self.kwargs['pk1'])
    return assignment

def get_context_data(self, **kwargs):
    context = super(AssignmentDetailView, self).get_context_data(**kwargs)
    context['teacher'] = Teacher.objects.get(id=self.kwargs['pk'])
    return context

现在可以了。我需要两个 pk 编号,因为“assignment_detail.html”上的标题是一个包含&lt;a href="% url 'teacher-profile' teacher.pk %"&gt;% include 'header-teacher.html' %。现在我从 url 传递了两个值:pk1 用于检索正确的分配,pk 提供(额外)正确的上下文(提供教师 pk)。

【讨论】:

【参考方案2】:

您的视图只返回一个查询集,而不是一个实际的对象(详细视图需要)。 如果您只是想获取作业对象,您甚至不需要传递teacher_id。在您的第一页上,您列出了一位老师的所有作业,您只需将 assignment.pk 传递到详细信息视图。

path('assignment/<int:pk>/', views.AssignmentDetailView.as_view(), name='assignment-detail')

如果您像上面一样创建您的 url,详细视图会通过 pk 处理获取对象。 如果您想在您的网址中包含教师 ID,您仍然可以这样做,但可以将其命名为 &lt;int:teacher_id&gt;。默认情况下,detailview 只会在 kwargs 中查找“pk”,因此请忽略teacher_id

【讨论】:

谢谢马特。我知道“过滤器”(返回查询集)和“获取”(返回单个对象)之间存在差异。不过,我需要两个pk,一个给老师,一个给作业。请参阅上面我编辑的帖子。 嗨,oxfos,您已经有了作业对象,因此您可以从作业中获取teacher_pk。在模板中,您可以这样做来获取教师 pk: object.teacher.pk 。

以上是关于如何在django模板中读取传递过去的字典参数中的某一项?的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给自定义 Django 模板加载器?

模板中的 Django 字典:从另一个对象属性中获取键

javascript中的Django模板值

Django框架中的视图和模板

Django:引用模板中的url名称并传递参数

在 django 模板 URL 标签中传递参数