2010-07-19 5 views
0

J'ai deux modèles avec des champs de limaces:Cartographie même Chemin d'URL de premier niveau à différents modèles

class Book(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField() 

class Author(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField() 

Je voudrais les associer au chemin de premier niveau:

(r'^(?P<slug>[a-zA-Z0-9_-]+)/$', 'book_detail'), 
(r'^(?P<slug>[a-zA-Z0-9_-]+)/$', 'author_detail'), 

Quelle est La meilleure façon d'y parvenir sans utiliser la même fonction et de retourner soit livre ou auteur basé sur la limace.

Répondre

4

La meilleure façon serait de scinder la vue:

r'^(?P<model>[a-zA-Z0-9_-]+)/(?P<slug>[a-zA-Z0-9_-]+)/$', 'some_detail') 

et vue:

def some_detail(request, model, slug): 
    try: 
     model = {'book':Book, 'author':Author}[model] 
    except KeyError: 
     raise Http404 

    item = get_object_or_404(model, slug=slug) 
    do_something_with(item) 
    ... 

modifier: Oh, plat comme ça ... ce serait:

(r'^(?P<slug>[a-zA-Z0-9_-]+)/$', 'universal_detail'), 

def universal_detail(request, slug): 
    try: 
     book = Book.objects.get(slug=slug) 
     return book_detail(request, book) 
    except Book.DoesNotExist: 
     pass 

    try: 
     author = Author.objects.get(slug=slug) 
     return author_details(request, author) 
    except Author.DoesNotExist: 
     raise Http404 

def book_detail(request, book): 
    # note that book is a book instance here 
    pass 
+0

Merci. Je voudrais seulement avoir une URL de niveau. mysite.com/mark-twain devrait retourner l'auteur, mysite.com/a-dogs-tale devrait retourner le livre. – Boolean

+0

Fonctionne très bien, merci! – Boolean

Questions connexes