Django:从DetailView上下文传递值到模板不起作用

时间:2015-10-03 20:58:35

标签: django

我在尝试渲染item_detail模板时看到以下错误,该模板在item_update视图的链接中使用了url标记:

NoReverseMatch at /mcadb/27/items/17
Reverse for 'item_update' with arguments '()' and keyword arguments '{u'course_id': '', u'pk': 17}' not found. 1 pattern(s) tried: [u'mcadb/(?P<course_id>[0-9]+)/items/(?P<pk>[0-9]+)/update/$']

试图匹配试用的模式有什么问题?是因为u吗?我不确定为什么会这样。

在views.py中,我尝试添加&#39; course_id&#39;到DetailView的上下文。我试图得到&#39; course_id&#39;来自kwargs的观点(我不知道为什么它是空白的)

views.py

class ItemDetailView(DetailView):
    DetailView.model=Item
    template_name='mcadb/item_detail.html'
    def get_context_data(self, **kwargs):
        context = super(ItemDetailView, self).get_context_data(**kwargs)
        context['course_id'] = self.kwargs['course_id']
        return context

urls.py

url(r'^(?P<course_id>[0-9]+)/items/(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='item_detail'),
url(r'^(?P<course_id>[0-9]+)/items/(?P<pk>[0-9]+)/update/$', views.ItemUpdate.as_view(), name='item_update'),

item_detail.html

<a href="{% url 'mcadb:item_update' course_id=course_id pk=item.id %}">Edit Item</a>

问题出在&#39; course_id = course_id&#39;线。如果我将其更改为&#39; course_id = 26&#39;,则item_detail.html呈现正常。

我有两个问题。 1.当看起来像我预期的那样传递两个kwargs时,错误是什么意思? 2.如果我对course_id进行硬编码,为什么会有效? 非常感谢,嘉莉

2 个答案:

答案 0 :(得分:3)

我认为这是错误:

url(r'^(?P<course_id>[0-9]+)/items/(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='item_detail'),

请注意,您使用通用DetailView(来自django.views.generic.DetailView)并使用此网址。

您需要使用自己的视图myapp.views.ItemDetailView

所以在urls.py文件中:

from myapp.views import ItemDetailView

url(r'^(?P<course_id>[0-9]+)/items/(?P<pk>[0-9]+)/$', ItemDetailView.as_view(), name='item_detail'),

答案 1 :(得分:1)

您的确切错误说明如下:

  

反向&#39; item_update&#39;参数&#39;()&#39;和关键字参数&#39; {u&#39; course_id&#39;:&#39;&#39;,u&#39; pk&#39;:17}&#39;未找到。尝试了1种模式:[u&#39; mcadb /(?P [0-9] +)/ items /(?P [0-9] +)/ update / $&#39;]

正如您所看到的,反向变为空course_id,并且无法使用空构建网址,因为必须至少有一个数字(正则表达式中的+符号)。因此,将course_id传递到上下文或url标记中肯定存在问题。尝试在url标记旁边打印该变量并检查其值。检查您是否可以在模板中的其他位置访问此变量(可能在所有for循环,包含和with标记之外)以及您是否可以直接从视图访问它(尝试使用反向创建URL或仅打印变量到日志)。