2010-07-19 2 views
0

다른 모델에 같은 첫 번째 수준의 URL 경로 :매핑 내가 슬러그 필드 두 가지 모델이

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() 

내가 처음 수준의 경로에 매핑 싶습니다 :

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

은 무엇을 동일한 기능을 사용하지 않고이 작업을 수행하고 슬러그를 기반으로 책이나 저자를 반환하는 가장 좋은 방법입니다.

답변

4

가장 좋은 방법은보기에서 분할하는 것입니다 :

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

및보기 :

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) 
    ... 

편집 : 아, 그런 평판이 ... 그 다음과 같습니다

(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

감사합니다. 한 수준의 URL 만 갖고 싶습니다. mysite.com/mark-twain은 저자를 반환해야하며 mysite.com/-dogs-tale은 책을 반환해야합니다. – Boolean

+0

대단히 고마워요! – Boolean