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

tch*_*ane 1 django django-templates django-views

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

我在我的list.html上列出了所有数据库对象,如下所示:

{% for instance in object_info %}
    <li><a href="object">{{ instance.name }}</a></li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我的views.py具有以下观点:

def object_view(request):
    data = Object.objects.filter(name="")
    context={
    'object_info':data
    }
    return render(request, "object.html", context)
Run Code Online (Sandbox Code Playgroud)

我可以将每个{{ instance.name }}视图传递给视图,并将其用作过滤器的变量吗?

Apo*_*sal 5

好吧,首先不要做这个:

data = Object.objects.filter(name="")
Run Code Online (Sandbox Code Playgroud)

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

data = Object.objects.all()
Run Code Online (Sandbox Code Playgroud)

其次,我希望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'),
]
Run Code Online (Sandbox Code Playgroud)

注意oidurl参数。我们将使用它来访问我们的特定对象。

现在,您的原始模板list.html看起来应该像这样:

    {% for instance in object_info %}
         <li><a href="{% url 'objects' oid = instance.id %}">instance.name</a></li>
    {% endfor %}
Run Code Online (Sandbox Code Playgroud)

在这里我们提供instance.id给oidURL参数生成类似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)
Run Code Online (Sandbox Code Playgroud)

现在,您只需要设计您specific_object.html的object实例并访问实例即可显示特定对象的详细信息:)。