NoReverseMatch django 基于类的视图

Posted

技术标签:

【中文标题】NoReverseMatch django 基于类的视图【英文标题】:NoReverseMatch django Class based views 【发布时间】:2014-02-21 22:44:33 【问题描述】:

我收到此错误

/author/add/4 处的 NoReverseMatch

未找到带有参数“()”和关键字参数“'pk': 39, 'user_id': >' 的“author_update”的反向操作。尝试了 1 种模式:['author/(?P\d+)/(?P\d+)$']

urls.py

     url(r'^author/add/(?P<user_id>\d+)$', AuthorCreate.as_view(), name='author_add'),
     url(r'^author/(?P<user_id>\d+)/(?P<pk>\d+)$', AuthorUpdate.as_view(), name='author_update'),
     url(r'^author/(?P<user_id>\d+)/(?P<pk>\d+)/delete/$', AuthorDelete.as_view(), name='author_delete'),
     url(r'^author/list/(?P<user_id>\d+)$', AuthorList.as_view(), name='author_list'),

models.py

  class Author(models.Model):
        subject = models.CharField( max_length=100)
        firstName  = models.CharField( max_length=100)
        lastName = models.CharField( max_length=100)
        email  = models.EmailField()
        message = models.TextField()
        created_by = models.ForeignKey(User)

        def get_absolute_url(self):
            return reverse('author_update', kwargs='pk': self.pk, 'user_id': self.created_by)

views.py

class AuthorCreate(LoginRequiredMixin, CreateView):
    model = Author
    fields = ['subject', 'firstName', 'lastName', 'email', 'message',]
    template_name = 'authorCreate.html'

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super(AuthorCreate, self).form_valid(form)

class AuthorList(LoginRequiredMixin, ListView):
    template_name = 'authorList.html'
    queryset = Author.objects.all()

    def get_context_data(self, **kwargs):
        context = super(AuthorList, self).get_context_data(**kwargs)
        if int(self.kwargs['user_id']) != self.request.user.id:
            raise PermissionDenied
        return context

终端错误

Internal Server Error: /author/add/4
Traceback (most recent call last):
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/utils/decorators.py", line 29, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in bound_func
    return func(self, *args2, **kwargs2)
  File "/home/ronald/best/A2/0124/vort/larb/views.py", line 52, in dispatch
    return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 205, in post
    return super(BaseCreateView, self).post(request, *args, **kwargs)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 171, in post
    return self.form_valid(form)
  File "/home/ronald/best/A2/0124/vort/larb/views.py", line 83, in form_valid
    return super(AuthorCreate, self).form_valid(form)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 148, in form_valid
    return super(ModelFormMixin, self).form_valid(form)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 78, in form_valid
    return HttpResponseRedirect(self.get_success_url())
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 136, in get_success_url
    url = self.object.get_absolute_url()
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/utils/functional.py", line 15, in _curried
    return _curried_func(*(args + moreargs), **dict(kwargs, **morekwargs))
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/db/models/base.py", line 1009, in get_absolute_url
    return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.model_name), func)(self, *args, **kwargs)
  File "/home/ronald/best/A2/0124/vort/larb/models.py", line 59, in get_absolute_url
    return reverse('author_update', kwargs='pk': self.pk, 'user_id': self.created_by)
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 509, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "/home/ronald/best/A2/0124/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 429, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
NoReverseMatch: Reverse for 'author_update' with arguments '()' and keyword arguments ''pk': 39, 'user_id': <SimpleLazyObject: <User: fdf>>' not found. 1 pattern(s) tried: ['author/(?P<user_id>\\d+)/(?P<pk>\\d+)$']

【问题讨论】:

【参考方案1】:

尝试将return reverse('author_update', kwargs='pk': self.pk, 'user_id': self.created_by)这一行改成:

return reverse('author_update', args=(self.pk, self.created_by.pk))

return reverse('author_update',
               kwargs='pk': self.pk, 'user_id': self.created_by.pk)

【讨论】:

这就是我得到的。 NoReverseMatch at /author/add/4 Reverse for 'author_update' 带有参数 '(>, 42)' 和关键字参数 '' 未找到。尝试了 1 种模式:['author/(?P\\d+)/(?P\\d+)$'] 谢谢!这很好用 return reverse('author_update', kwargs='pk': self.pk, 'user_id': self.created_by.pk)

以上是关于NoReverseMatch django 基于类的视图的主要内容,如果未能解决你的问题,请参考以下文章

NoReverseMatch 在 /category/clothes/ 基于 Django 类的视图

按函数名称的 Django 反向基于类的视图不起作用

没有反向匹配 - django.urls.exceptions.NoReverseMatch

Django 查看错误 - NoReverseMatch

网址 django,NoReverseMatch

如何修复 Django“NoReverseMatch”错误