我在尝试渲染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进行硬编码,为什么会有效? 非常感谢,嘉莉
答案 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或仅打印变量到日志)。