Сопоставление одного и того же пути URL первого уровня с разными моделями - PullRequest
0 голосов
/ 20 июля 2010

У меня есть две модели с полями слагов:

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'),

Какой лучший способ сделать это, не используя ту же функцию и возвращая книгу или автора, основываясь на слаге.

1 Ответ

3 голосов
/ 20 июля 2010

Лучшим способом было бы разделить его на представление:

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

edit: О, плоский как этот ... это было бы:

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