NoReverseMatch для вопроса новичка get_absolute_url () - PullRequest
1 голос
/ 27 апреля 2011

Только что начал играть с django и был перепутан с функциональностью get_absolute_url.

Когда я пытаюсь получить доступ к URL-адресу объекта, я получаю ошибку NoReverseMatch.Вот трассировка стека

$ python manage.py shell
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from food.models import *
>>> r = Restaurant.objects.get(pk=1)
>>> r
<Restaurant: East Side Marios>
>>> r.get_absolute_url()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/utils/functional.py", line 55, in _curried
    return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 887, in get_absolute_url
    return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/__init__.py", line 35, in inner
    return reverse(bits[0], None, *bits[1:3])
  File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 391, in reverse
    *args, **kwargs)))
  File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 337, in reverse
    "arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'food.views.restaurant_details' with arguments '()' and keyword arguments '{'restaurant_id': ['1']}' not found.

Вот что у меня есть до сих пор

server / urls.py

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',

  # ADMIN
  (r'^admin/doc/', include('django.contrib.admindocs.urls')),
  (r'^admin/', include(admin.site.urls)),

  # Restaurants
  (r'^restaurants/$', 'food.views.restaurant_index'),
  (r'^restaurants/(\d+)/$', 'food.views.restaurant_details'),
)

server/food/models.py

class Restaurant(models.Model):
  name        = models.CharField(max_length=50, unique=True)
  description = models.TextField()
  website     = models.URLField(verify_exists=True)
  def __unicode__(self):
    return self.name
  @models.permalink
  def get_absolute_url(self):
    return ('food.views.restaurant_details', (), {'restaurant_id': [str(self.id)]})

server / food / views.py

from food.models import *
from django.shortcuts import render_to_response, get_object_or_404

# Restaurant

def restaurant_index(request):
    restaurant_list = Restaurant.objects.all()
    return render_to_response('food/restaurant/index.html', {'restaurant_list': restaurant_list})

def restaurant_details(request, restaurant_id):
    restaurant = get_object_or_404(Restaurant, pk=restaurant_id)
    menu_list  = Menu.objects.filter(restaurant=restaurant_id)
    return render_to_response('food/restaurant/detail.html', {'restaurant': restaurant, 'menu_list': menu_list})

Веб-сайт для restaurant_index работает нормально, за исключением того, чтоКонечно, URL для любого ресторана - пустая строка

template

{% if restaurant_list %}
  <ul>
    {% for restaurant in restaurant_list %}
      <li><a href="{{ restaurant.get_absolute_url }}">{{ restaurant }}</a></li>
    {% endfor %}
  </ul>
{% else %}
  <p>No restaurants are currently listed.</p>
{% endif %}

html

<ul>
  <li><a href="">East Side Marios</a></li>
</ul>

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Помимо решения, предоставленного Imran, вы можете рассмотреть именованные шаблоны URL:

urls.py

urlpatterns = patterns('',
  url(r'^restaurants/(\d+)/$', 'food.views.restaurant_details', name='restaurant_detail'),
)

restaurant_index.html

<a href="{% url restaurant_detail restaurant.id%}">{{ restaurant }}</a>

Таким образом, вы не привязаны к имени функции вашего представления и позволяет более легко переключаться на общие представления.

3 голосов
/ 27 апреля 2011
(r'^restaurants/(\d+)/$', 'food.views.restaurant_details'),

Ваш шаблон URL захватывает restaurant_id как неназванную группу, поэтому вам нужно либо указать restaurant_id в качестве позиционного аргумента, либо изменить шаблон URL, чтобы захватить restaurant_id как именованную группу

Изменить шаблон URL на этот

(r'^restaurants/(?P<restaurant_id>\d+)/$', 'food.views.restaurant_details'),

или верните это из get_absolute_url

return ('food.views.restaurant_details', (str(self.id),), {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...