Джанго новичок - ошибки NoReverseMatch - PullRequest
2 голосов
/ 12 сентября 2009

Я только начал работать с Django, но наткнулся на стену - я решил поэкспериментировать с написанием простого движка блога, обращаясь к библиотеке django-basic-apps.

В блоге / urls.py у меня есть эта запись для сопоставления с фактическим сообщением по дате, например, Блог / 2009 / Август / 01 / тест-сообщение * * 1003

urlpatterns = patterns('',
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$', 'blog.views.post_detail'),
    ...

И представление для рендеринга поста:

def post_detail(request, slug, year, month, day, **kwargs):
return date_based.object_detail(
    request,
    year = year,
    month = month,
    day = day,
    date_field = 'created_at',
    slug = slug,
    queryset = Content.objects.filter(published=True),
    **kwargs
)

В модели, которую я внедрил, get_absolute_url, чтобы на одной главной странице блога я мог щелкнуть заголовок сообщения, чтобы просмотреть его:

class Content(models.Model):
    ...
@permalink
def get_absolute_url(self):
    return ('blog.views.post_detail', (), {
        'slug': self.slug,
        'year': self.created_at.year,
        'month': self.created_at.strftime('%b').lower(),
        'day': self.created_at.day
    })

Наконец, в списке сообщений главной страницы должна быть вставлена ​​постоянная ссылка в заголовок:

{% for content in object_list %}
<div class="content_list">
<h3 class="content_title"><a href="{{ content.get_absolute_url }}">{{ content.title }}</a></h3>
<p class="content_date">{{ content.published_at|date:"Y F d"}}</p>
<p class="content_body">{{ content.body }}</p>
<p class="content_footer">updated by {{ content.author }} at {{ content.updated_at|timesince }} ago</p>
</div>
{% endfor %}

Однако ссылка отображается как пустая, и когда я пытаюсь вызвать content.get_absolute_url() из оболочки django, выдается ошибка:

NoReverseMatch: Reverse for '<function post_detail at 0xa3d59cc>' with arguments '()' and keyword arguments '{'year': 2009, 'slug': u'another_test', 'day': 15, 'month': 'aug'}' not found.

Edit: Оказывается, это была проблема с пространством имен Python (см. Ниже). Но все равно, был ли мой urls.py , как показано выше, неверным?

1 Ответ

3 голосов
/ 12 сентября 2009

Поискал по другим учебникам по Django для новичков и получил идею поместить все URL-адреса в родительскую папку urls.py, и это, похоже, решило проблему. :) Итак, в итоге мой основной urls.py теперь имеет:

from djangoblog.blog import views
urlpatterns = patterns('',

    (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
    views.post_detail),
    (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/$',
    views.post_archive_day),
    ...

Редактировать: Редактировать: После 2 дней случайного взлома я понимаю, что URLconfs + django теперь выглядят намного лучше, к счастью. :) Я переместил шаблоны обратно в blog / urls.py, избавился от всех пользовательских представлений на основе даты и вместо этого вызвал их из urls.py, а также правильно назвал шаблоны для элементов, которые необходимо @ permalinked.

urls.py с именованным шаблоном:

from blog import views
...
(r'(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
    'object_detail', dict(info_dict, slug_field='slug', month_format='%m'),
    'post_detail'),
...
(r'category/(?P<slug>[-\w]+)/$', views.category_detail),

models.py:

class Post:
    @permalink
    def get_absolute_url(self):
    return ('post_detail', (), {
                  ....

class Category:
    @permalink
def get_absolute_url(self):
    return ('blog.views.category_detail', (), {'slug': self.slug})
...