Django:如何将对象/对象id传递给另一个模板

时间:2012-01-26 03:46:18

标签: django

我是Django Web框架的新手。

我有一个显示所有对象列表的模板。我将所有单个对象列为链接(对象标题),单击我要重定向到另一个页面,该页面显示该特定对象的对象详细信息。 我能够列出对象,但无法将对象/对象id转发到下一个模板以显示详细信息。

views.py

def list(request):
    listings = listing.objects.all()
    return render_to_response('/../templates/listings.html',{'listings':listings})

def detail(request, id):
    #listing = listing.objects.filter(owner__vinumber__exact=vinumber)
    return render_to_response('/../templates/listing_detail.html')

和模板为: list.html

{% for listing in object_list %}
<!--<li> {{ listing.title }} </li>-->
<a href="{{ listing.id }}">{{ listing.title}}</a><br>
{% endfor %}

detail.html

{{ id }}

3 个答案:

答案 0 :(得分:4)

您在render_to_response字典中传递的变量是最终出现在模板中的变量。因此,在detail中,您需要添加{'listing': MyModel.objects.get(id=vinumber)}之类的内容,然后模板应该说{{ listing.id }}。但如果ID不存在,则会崩溃,因此最好使用get_object_or_404

此外,您的模板会在object_list上方循环,但视图会在listings中传递 - 其中一个必须与您目前正在使用的内容不同....

此外,您应该在模型上使用{% url %} tag和/或get_absolute_url:而不是直接说href="{{ listing.id }}",请说href="{% url listing-details listing.id %}",{{1}是listing-details中视图的名称。更好的方法是使用get_absolute_url function为您的模型添加the permalink decorator;然后你可以说urls.py,这样可以更容易地将你的网址结构更改为更好看,或者使用除数据库ID之外的某些属性。

答案 1 :(得分:0)

您应该查看@permalink decorator。它使您能够根据您的网址模式和相应的view_function为模型生成链接。

例如:

# example model
class Example(models.Model):
    name = models.CharField("Name", max_length=255, unique=True)
    #more model fields here

    #the permalink decorator with get_absolute_url function
    @models.permalink
    def get_absolute_url(self):
        return ('example_view', (), {'example_name': self.name})

#example view
   def example_view(request, name, template_name):
        example = get_object_or_404(Example, name=name)
        return render_to_response(template_name, locals(),
                              context_instance=RequestContext(request))

   #example urls config
       url(r'^(?P<name>[-\w]+)/$', 'example_view', {'template_name': 'example.html'}, 'example_view')

现在,您可以在模板中执行以下操作:

<a href={{ example.get_absolute_url }}>{{ example.name }}</a>

希望这有帮助。

答案 2 :(得分:0)

在您的详细信息方法中,只需将列表传递到模板中,如下所示:

def detail(request, id):
    l = listing.objects.get(pk=id)
    return render_to_response('/../templates/listing_detail.html', {'listing':l})