Django NoReverseMatch Ошибка в модификации блога - PullRequest
1 голос
/ 11 апреля 2011

Я только что сделал учебник блога Django, найденный здесь: Учебник блога

Я сейчас пытаюсь добавить функциональность, которая будет подсчитывать количество просмотров, полученных постом в блоге. Для этого я добавил следующее в views.py (обратите внимание, что views.py полностью пуст в учебнике, потому что он использует общие представления Django):

def detail_view(request, object_id):
object = Post.objects.filter(id=object_id)
object.update(counter = F('counter') + 1)

return render_to_response('posts/post_detail.html', {'object':object}, context_instance=RequestContext(request))

Не уверен, правильно ли я сделал это render_to_response. Мой urls.py сейчас:

from models import Post
queryset = {'queryset': Post.objects.order_by('-pub_date')}
urlpatterns = patterns('',
    url('^$', 'django.views.generic.list_detail.object_list', queryset, name="posts"),
    url('^(?P<object_id>\d+)/$', 'posts.views.detail_view', name="post")

Мой post_list.html имеет следующий код, который создает ссылку на post_detail.html:

<a href={% url post object.id %}>{{ object.title }}</a>

И полная ошибка:

> Exception Value:  
Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.

Traceback:

> Environment:


Request Method: GET
Request URL: localhost:8000/1/

Django Version: 1.3
Python Version: 2.6.1
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.comments',
 'django.contrib.admin',
 'Blog.posts',
 'Blog.categories']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Template error:
In template /Users/kevin/PycharmProjects/Blog/templates/posts/_post.html, error at line 3
   Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.
   1 : <div id=”object_{{ object.id }}”>


   2 : <h2>


   3 :     <a href= {% url post object.id %} >{{ object.title }}</a>


   4 :     <small>{{ object.pub_date|timesince }} ago</small>


   5 :     </h2>


   6 :     {{ object.body }}


   7 : </div>

Traceback:
File "/Library/Python/2.6/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/kevin/PycharmProjects/Blog/posts/views.py" in detail_view
  12.     return render_to_response('posts/post_detail.html', {'object':object}, context_instance=RequestContext(request))
File "/Library/Python/2.6/site-packages/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/Library/Python/2.6/site-packages/django/template/loader.py" in render_to_string
  188.         return t.render(context_instance)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  123.             return self._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
  117.         return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
  73.             result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
  117.         return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
  73.             result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
  64.             result = block.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
  73.             result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
  159.         return self.render_template(self.template, context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render_template
  141.         output = template.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  123.             return self._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
  117.         return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
  73.             result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/defaulttags.py" in render
  450.                         raise e

Exception Type: TemplateSyntaxError at /1/
Exception Value: Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.

Я пытался понять, что не так часами, но не нашел ответа. Я также читал кучу вещей здесь, на SO.com, но все же не повезло.

Ваша помощь очень ценится.

Спасибо!

1 Ответ

0 голосов
/ 11 апреля 2011

Попробуйте:

<a href="{% url post object_id=object.id %}">{{ object.title }}</a>

Вам нужно указать имя параметра, чтобы сделать обратное счастливым. Кроме того, вы должны процитировать URL.

P.S. Ваш оригинальный код сработал бы, если бы ваш URL-адрес был:

url('^(\d+)/$', 'posts.views.detail_view', name="post")

но это не рекомендуемый способ сделать это.

Кроме того, похоже, что вы должны сделать:

... , {'object':object[0]}, ...

в вашем render_to_response звонке. filter просто возвращает измененный набор запросов, который прекрасно работает с update, но в вашем шаблоне вы рассматриваете его как объект, поэтому вам следует разрешить его для объекта при помещении его в контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...