我想使用相同的模板来查看有关每个数据库对象的信息。我希望能够点击列表中的每个元素,并将它链接到一个包含相关信息的页面。我认为这比为每个独特的对象制作一个视图更简单。
我列出了list.html上的所有数据库对象:
{% for instance in object_info %}
<li><a href="object">{{ instance.name }}</a></li>
{% endfor %}
我的views.py有这样的观点:
def object_view(request):
data = Object.objects.filter(name="")
context={
'object_info':data
}
return render(request, "object.html", context)
我可以将每个{{ instance.name }}
传递给视图并将其用作我的过滤器的变量吗?
答案 0 :(得分:4)
好的,首先请不要这样做:
data = Object.objects.filter(name="")
Django有一个all()
函数,它将返回所有对象:
data = Object.objects.all()
其次,我希望object_view
,data
,object_info
,object.html
不是您实际的变量名称!如果是这样,请确保它们对您的申请有意义。
好的回到你的问题。好吧,你不需要为每个对象制作一个视图。我假设<a href="object">...</a>
应引用将填充所选对象的新页面。
如果是这样,您可能希望<a>
标记中的网址如下:/objects/object_id/
。
这个新网址需要在urls.py
:
urlpatterns += [
url(r'^objects/(?P<oid>[0-9]+)/$', views.object_specific_view, name='objects'),
]
注意oid
url参数。我们将使用它来访问我们的特定对象。
现在您的原始模板list.html
应如下所示:
{% for instance in object_info %}
<li><a href="{% url 'objects' oid = instance.id %}">instance.name</a></li>
{% endfor %}
我们提供instance.id
到oid
个url参数的位置,以生成objects/1/
或objects/2/
等内容。
现在,这意味着您只需要使用另一个模板再创建一个视图。
您的第二个观点object_specific_view
:
def object_specific_view(request, oid): # The url argument oid is automatically supplied by Django as we defined it carefully in our urls.py
object = Object.objects.filter(id=oid).first()
context={
'object':object
}
return render(request, "specific_object.html", context)
现在您只需设计specific_object.html
并访问object
实例以显示特定对象的详细信息:)。