2009-11-09 5 views
0

Je viens de commencer Django et Python, Im encore nouveau à ce .. Ceci est mon urls.py:champ Slug suivi par url

url(r'(?P<slug>[-\w]+)/$','person_detail'), 
url(r'(?P<slug>[-\w]+)/delete/$','person_delete'), 

Le problème est que lorsque je tente de faire à l'url : slug/delete/il cherche cette partie entière slug/delete/comme le slug. Lorsque je supprime le $ dans la première url, il ne va pas à la vue person_delete, mais va à la vue person_detail, en ignorant la/delete/part Des idées?

Répondre

6

Essayez d'ajouter un leader ^:

url(r'^(?P<slug>[-\w]+)/$','person_detail'), 
url(r'^(?P<slug>[-\w]+)/delete/$','person_delete'), 

Cela dit, sans le ^ j'attends foo/delete/ de vous faire le point de vue person_detail avec slug comme delete, plutôt que foo/delete.

+1

Quand - est le premier caractère d'une classe de caractères, il ne désigne pas une gamme, mais est plutôt un littéral -. – AKX

+0

@AKX - merci. Edité avec ce que je * pense * pourrait être le problème. –

1

Que diriez-vous quelque chose comme

url(r'(?P<slug>[^/]+)/$','person_detail'), 
url(r'(?P<slug>[^/]+)/delete/$','person_delete'), 

pour vous assurer que le bouchon ne peut pas contenir une barre oblique? Vous pouvez également essayer d'avoir les règles dans l'ordre inverse, pour essayer de faire correspondre Django /.../delete/ en premier.

+0

'[- \ w] +' ne correspondra pas non plus '/'. '\ w' est un synonyme de' [a-zA-Z0-9_] ', et' -' (au début de la fin d'un ensemble) est, bien, un tiret. – mipadi

0
url(r'(?P<slug>[-\w]+)/delete/$','person_delete'), 
url(r'(?P<slug>[-\w]+)/','person_detail'), 

L'ordre d'URL est important dans de tels cas, car l'URL dispacher en utilisant la première correspondance. L'URL commune devrait être la dernière.

+0

Pas dans ce cas, puisque l'OP a terminé ses URL avec le signe '$', qui correspond à la fin de la chaîne. – mipadi

+0

Oups ... j'ai mal compris la question - je pense qu'il supprime $ de la première URL, qui a causé tous les problèmes. – shiberz

1

Notez que Slug champs pourraient également inclure des chiffres (non seulement des lettres et le tableau de bord), de sorte que vous voulez modifier pour dire quelque chose comme:

SLUG = '(?P<slug>[\w\d-]+)' 

url(r'^'+SLUG+'/delete$', delete_method, {}, 'delete_url_name')