2009-11-22 7 views
4

Après le débogage pendant un moment j'ai trouvé ce que l'erreur était, mais je ne sais pas comment y remédier.NoReverseMatch dans django

  • J'ai un petit morceau URLConf le nom « ver_caja » qui reçoit comme argument l'identifiant d'un objet caja, puis appeler le object_detail générique.
  • Le jeu de requête est correct: récupérez correctement tous les objets caja.
  • Dans le modèle que je la conférence téléphonique: {% ver_caja caja.id %}
  • L'objet caja est reçu correctement par le modèle.
  • J'utilise MySQL.

Le problème est que caja.id a une valeur "1L" au lieu de "1".

Cette 1L augmente l'erreur parce que le URLConf (ver_caja) attend un nombre entier non alphanumérique un « <int>L ».

Toutes les informations que je suis arrivé dans le site docs django est-ce (comme un exemple dans un tutoriel), et il ne permet pas:

... 

>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now()) 

# Save the object into the database. You have to call save() explicitly. 
>>> p.save() 

# Now it has an ID. Note that this might say "1L" instead of "1", depending 
# on which database you're using. That's no biggie; it just means your 
# database backend prefers to return integers as Python long integer 
# objects. 
>>> p.id 

... 

Alors, comment pourrais-je résoudre ce problème pour recevoir caja.id=1 au lieu de caja.id=1L?

Merci d'avance.

Pedro

EDIT: Vous avez tous les fichiers.

erreur de modèle:

Caught an exception while rendering: Reverse for 'ver_caja_chica' with arguments '(1L,)' and keyword arguments '{}' not found.

caja/models.py

class Caja(models.Model): 
    slug = models.SlugField(blank=True) 
    nombre = models.CharField(max_length=20) 
    saldo = models.DecimalField(max_digits=10, decimal_places=2) 
    detalle = models.TextField(blank=True, null=True) 

    # apertura 
    fechahora_apert = models.DateTimeField(default=datetime.datetime.now, auto_now_add=True) 
    usuario_apert = models.ForeignKey(Usuario, related_name=u'caja_abierta_por', help_text=u'Usuario que realizó la apertura de la caja.') 

    # cierre 
    fechahora_cie = models.DateTimeField(blank=True, null=True) 
    usuario_cie = models.ForeignKey(Usuario, null=True, blank=True, related_name=u'caja_cerrada_por', help_text=u'Usuario que realizó el cierre de la caja.') 

    def __unicode__(self): 
     return u'%s, $%s' % (self.nombre, self.saldo) 

    class Meta: 
     ordering = ['fechahora_apert'] 


class CajaChica(Caja): 
    dia_caja = models.DateField(default=datetime.date.today, help_text=u'Día al que corresponde esta caja.') 
    cerrada = models.BooleanField(default=False, help_text=u'Si la caja está cerrada no se puede editar.') 

caja/urls.py

cajas_chicas = { 
    'queryset': CajaChica.objects.all(), 
} 

urlpatterns = patterns('', 
    url(r'^$', 'django.views.generic.list_detail.object_list', dict(cajas_chicas, paginate_by=30), name="lista_cajas_chicas"), 
    url(r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', dict(cajas_chicas,), name="ver_caja_chica"), 
) 

cajachica_list.html

... 
<table> 
{% for obj in object_list %} 
<tr class="{% cycle 'row1' 'row2' %}"> 
    <td>{{ obj.nombre|capfirst }}</td> 
    <td>{{ obj.fechahora_apert|timesince }}</td> 
    <td>{{ obj.usuario_apert }}</td> 
    <td>{{ obj.saldo }}</td> 
    <td><a href="{% url ver_caja_chica obj.pk %}">Ver/Editar</a></td> 
</tr> 
{% endfor %} 
</table> 
... 

EDIT-2 Avec une mauvaise URLconf (à but), ce sont les urls pour cette application:

... 
4. ^caja/$ ^$ 
5. ^caja/$ ^(?P<object_id>\d+)/$ 
... 

Peut-être que l'URL finale est été construit mal par django.

Ces URL se trouvent à l'intérieur de caja/urls.py et sont incluses par urls.py dans le répertoire racine du projet.

Un indice?

+0

Ajoutez les lignes réelles de 'urls.py' à la question - je pense que c'est où le problème sera. '1L' est juste la façon d'imprimer un entier long de python - je ne pense pas que ce sera le problème. >>> a = 1L >>> un 1L >>> str (a) '1' >>> –

+0

I ajouté la totalité du code de débogage. : P Il semble clair dans le texte d'erreur que l'erreur est dans le paramètre ('1L'). Si ce n'est pas le problème, alors je ne sais pas ... – pmourelle

+0

Essayez de regarder les objets que vous obtenez pour le jeu de requête. Est-ce que tous ont un int long? Comment stockez-vous cela dans le db? – googletorp

Répondre

8

Êtes-vous sûr que vous avez réellement connecté cette configuration URL jusqu'à la configuration de votre URL principale?

Dans votre projet de urls.py, assurez-vous que vous avez quelque chose comme:

urlpatterns = patterns('', 
    #... 
    url(r'^cajas/', include('caja.urls')), 
) 
+4

Homme, cette erreur pourrait être facilement le débutant et la plus stupide erreur dans l'histoire de Django. J'ai passé plusieurs jours à essayer de réparer ce ## $ @ !!! problème. Tout cela parce qu'un f ***** ing '$' !!!!! Mon urlconf dans le répertoire racine était: (r '^ cajas/$', include ('ceom.cajas.urls')), Je ne me suis jamais rendu compte du '$' qui restait avant que je fasse le modèle 'cajas '. Je me sens idiot. Merci. – pmourelle

+3

+1 Ne vous inquiétez pas, j'utilise Django depuis des années et j'ai laissé '$' là avant que je ne sépare mes vues dans une application. La prochaine fois que je clique sur NoReverseMatch, la première fois que je trierai, elle devrait correspondre. –

2

Le problème n'est pas du tout ce que vous pensez. Les arguments sont affichés comme '(1L,)', donc la valeur dans le tuple est un entier, quoique long, et non une chaîne, qui aurait été affichée comme '('1L',)'.(L'explication pour le L est montrée dans le commentaire du code que vous avez posté).

En fait, le problème est que votre URL attend un argument de mot clé nommé, pas un argument de position non nommé. C'est parce que vous avez nommé le groupe regex: (?P<object_id>\d+). Donc, la balise URL doit être:

{% url ver_caja_chica object_id=obj.pk %} 
+0

En fait, cela n'a pas d'importance. Vous pouvez toujours utiliser des arguments positionnels pour les groupes regex nommés. – SmileyChris

+0

@ SmileyChris: que se passe-t-il si l'ordre des arguments ne correspond pas à ce que l'URLConf attend? Je n'ai jamais été capable de faire ce travail. Passez les arguments positionnels où les arguments nommés sont attendus. C'est la chose la plus sûre et la plus fiable à faire. – jcdyer

+0

@Daniel Roseman - Smiley a raison de dire que ce n'est pas le problème. J'ai fait la modification que vous avez proposée, et l'erreur est toujours là: "Pris une exception lors du rendu: Inverser pour 'ver_caja_chica' avec les arguments '()' et les arguments '{' object_id ': 1L}' non trouvé." : S Le mystère reste non résolu. – pmourelle