2012-10-19 3 views
2

J'ai rencontré un problème avec la génération d'URL inverse dans les modèles dans django. J'essaie de le résoudre depuis quelques heures et je n'ai aucune idée de ce que pourrait être le problème. travaux d'inversion URL grands dans les modèles et vues:Django, balise url dans le modèle ne fonctionne pas: NoReverseMatch

# like this in models.py 
@models.permalink 
    def get_absolute_url(self): 
     return ('entry',(), { 
      'entry_id': self.entry.id, 
     }) 

# or this in views.py 
return HttpResponseRedirect(reverse('entry',args=(entry_id,))) 

mais quand je suis en train de le faire dans le modèle je reçois une telle erreur:

NoReverseMatch at /entry/1/
Reverse for ''add_comment'' with arguments '(1L,)' and keyword arguments '{}' not found.

Ma structure de fichier ressemble à ceci:

project/ 
├── frontend 
│   ├── models.py 
│   ├── urls.py 
│   └── views.py 
├── settings.py 
├── templates 
│   ├── add_comment.html 
│   └── entry.html 
├── utils 
│   └── with_template.py 
└── wsgi.py 

Mon urls.py:

from project.frontend.views import * 
from django.conf.urls import patterns, include, url 

urlpatterns = patterns('project.frontend.views', 

    url(r'^entry/(?P<entry_id>\d+)/', 'entry', name="entry"), 
    (r'^entry_list/', 'entry_list'), 

Puis entry_list.html:

{% extends "base.html" %} 
{% block content %} 
    {% for entry in entries %} 
      {% url 'entry' entry.id %} 
    {% endfor %} 
{% endblock %} 

Dans views.py J'ai:

@with_template 
def entry(request, entry_id): 
    entry = Entry.objects.get(id=entry_id) 
    entry.comments = entry.get_comments() 
    return locals() 

où with_template est décorateur suivant (mais je ne pense pas que ce soit un cas):

class TheWrapper(object): 
    def __init__(self, default_template_name): 
     self.default_template_name = default_template_name 

    def __call__(self, func): 
     def decorated_func(request, *args, **kwargs): 
      extra_context = kwargs.pop('extra_context', {}) 
      dictionary = {} 
      ret = func(request, *args, **kwargs) 
      if isinstance(ret, HttpResponse): 
       return ret 
      dictionary.update(ret) 
      dictionary.update(extra_context) 
      return render_to_response(dictionary.get('template_name', 
                self.default_template_name), 
             context_instance=RequestContext(request), 
             dictionary=dictionary) 
     update_wrapper(decorated_func, func) 
     return decorated_func 

if not callable(arg): 
    return TheWrapper(arg) 
else: 
    default_template_name = ''.join([ arg.__name__, '.html']) 
    return TheWrapper(default_template_name)(arg) 

Avez-vous une idée de ce qui peut causer le problème? Un grand merci d'avance!


EDIT: Je viens de faire une expérience. Je commentais tout ce que je pouvais laisser seulement: urls.py

# -*- coding: UTF-8 -*- 
from justmetyou.frontend.views import * 
from django.conf.urls import patterns, include, url 
urlpatterns = patterns('justmetyou.frontend.views', 
    url(r'^entry/(?P<entry_id>\d+)/', 'entry', name="entry"), 
) 

views.py

# -*- coding: UTF-8 -*- 
from justmetyou.frontend.models import * 
from django.shortcuts import render_to_response, get_object_or_404 
def entry(request, entry_id): 
    entry = Entry.objects.get(id=entry_id) 
    return render_to_response('entry.html', {'entry':entry}) 

entry.html

{% extends "base.html" %} 
{% block content %} 
{% url 'entry' 1 %} 
{% endblock %} 

Et rien n'a changé. Je reçois la même erreur tout le temps. Alors maintenant, je suis beaucoup plus confus, parce que dans ce code simple tout va bien. Pensez-vous qu'il est possible que ce soit une question de matériel externe comme serveur ou smth comme ça ...? Je n'ai aucune idée ...

+2

Il semble que le problème est avec les 'add_comment' URL, pas' entry'. Montrez-nous 'entry.html'? –

Répondre

2

Je suppose que vous utilisez Django 1.3 et vous n'avez pas appelé {% load url from future %}.

Donc, essayez la place sans ' autour du nom de l'URL:

{% url entry 1 %} 
+0

J'utilise Django 1.4.1, mais vous avez raison, c'était le cas. Merci beaucoup! :) Je ne pense pas que ce soit une erreur stupide comme celle-ci ... – lukaszzenko

+0

@ ŁukaszJocz Content que ça marche :) –

Questions connexes