Django:将对象从模板传递到视图

时间:2016-12-10 22:25:15

标签: django django-templates django-views

我想使用相同的模板来查看有关每个数据库对象的信息。我希望能够点击列表中的每个元素,并将它链接到一个包含相关信息的页面。我认为这比为每个独特的对象制作一个视图更简单。

我列出了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 }}传递给视图并将其用作我的过滤器的变量吗?

1 个答案:

答案 0 :(得分:4)

好的,首先请不要这样做:

data = Object.objects.filter(name="")

Django有一个all()函数,它将返回所有对象:

data = Object.objects.all()

其次,我希望object_viewdataobject_infoobject.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.idoid个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实例以显示特定对象的详细信息:)。