【问题标题】:Mapping the same first-level URL path to different models将相同的一级URL路径映射到不同的模型
【发布时间】:2010-07-19 22:10:19
【问题描述】:

我有两个带有 slug 字段的模型:

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

在不使用相同的函数并根据 slug 返回书籍或作者的情况下,最好的方法是什么?

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    最好的方法是在视图中拆分它:

    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
    

    【讨论】:

    • 谢谢。我只想有一个级别的网址。 mysite.com/mark-twain 应该归还作者,mysite.com/a-dogs-tale 应该归还书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多