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 ...
Il semble que le problème est avec les 'add_comment' URL, pas' entry'. Montrez-nous 'entry.html'? –