如何在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”上的标题是一个包含<a href="% url 'teacher-profile' teacher.pk %">
的% 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,您仍然可以这样做,但可以将其命名为 <int:teacher_id>
。默认情况下,detailview 只会在 kwargs 中查找“pk”,因此请忽略teacher_id
【讨论】:
谢谢马特。我知道“过滤器”(返回查询集)和“获取”(返回单个对象)之间存在差异。不过,我需要两个pk,一个给老师,一个给作业。请参阅上面我编辑的帖子。 嗨,oxfos,您已经有了作业对象,因此您可以从作业中获取teacher_pk。在模板中,您可以这样做来获取教师 pk: object.teacher.pk 。以上是关于如何在django模板中读取传递过去的字典参数中的某一项?的主要内容,如果未能解决你的问题,请参考以下文章