2009-09-12 6 views
2

Je viens juste de commencer avec Django mais je suis tombé sur un mur - j'ai décidé d'essayer d'écrire un simple moteur de blog en faisant référence à la bibliothèque django-basic-apps.Django newbie - Erreurs NoReverseMatch

Dans blog/urls.py, j'ai cette entrée pour mapper à la publication réelle par date, par exemple. blog/2009/Août/01/test post

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

Et la vue pour rendre le message:

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 
) 

Dans le modèle que je mis en œuvre get_absolute_url pour que l'on la page principale du blog que je pouvais cliquez sur un titre de poste pour l'afficher:

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 
    }) 

Enfin, dans la liste des articles de la page principale, ce permalien est censé être inséré dans le titre:

{% 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 %} 

Cependant, le lien apparaît comme vide, et quand je tente d'appeler content.get_absolute_url() des django shell l'erreur est jeté:

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: Il s'avère que c'était un problème d'espace de noms Python (voir au dessous de). Mais de toute façon, mon urls.py comme indiqué ci-dessus était-il incorrect?

Répondre

3

Googled autour pour d'autres tutoriels de débutant Django et a eu l'idée de mettre toutes les URL dans le dossier parent urls.py, et cela semblait résoudre le problème. :) Donc à la fin, ma principale urls.py a maintenant:

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), 
    ... 

Edit: Edit: Après 2 jours de piratage informatique occasionnel Je comprends URLconfs + django vues beaucoup mieux maintenant, heureusement. :) J'ai replacé les motifs dans le blog/urls.py, me suis débarrassé de toutes les vues personnalisées basées sur les dates et les ai appelées depuis urls.py à la place, et ai correctement nommé des motifs pour les éléments qui doivent être @permalinked.

urls.py avec motif nommé:

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})