视图不同但呈现相同的模板

Views are different but rendering same template

我想在两个 url 中都使用 slug 字段,即

path('<slug:title>/',views.news_read,name="news_read"),
path('<slug:title>/',views.movie_read,name="movie_read"),

但是 url 都选择了相同的模板而不是他们的模板,我正在尝试创建博客网站 我不明白 url 都是唯一的,所以为什么 django 选择了错误的模板

我对url

的看法
def movie_read(request, title):
    movie = Movie.objects.filter(urltitle=title)
    if request.method == 'POST':
        form = Commentform(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Thank You For Your Comment')
    else:
        form = Commentform()
    return render(request,'movie_read.html',{'movie':movie,'form':form})

def news_read(request, title):
    news = News.objects.filter(urltitle=title)
    if request.method == 'POST':
        form = Commentform(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Thank You For Your Comment')
    else:
        form = Commentform()
    return render(request,'news_read.html',{'news':news,'form':form})

但是我什么时候做这样的改变它起作用了

path('<slug:title>/news',views.news_read,name="news_read"),
path('<slug:title>/movie',views.movie_read,name="movie_read"),

但这看起来不太好,不知道如何解决这个问题

看来tou url路径是一样的,这就是django选错视图的原因。 尝试将 urls 更改为: 路径('news/slug:title/',views.news_read,name="news_read"), 路径('movies/slug:title/',views.movie_read,name="movie_read"),

Django 将“触发”匹配 URL 的第一个路径。因此,这意味着对于您输入的每个 slug,news_read 都会触发。

您可以通过尝试查询两个模型来解决这个问题,然后决定使用哪个模型,例如:

def my_view(request, title):
    is_movie = Movie.objects.filter(urltitle=title).exists()
    if is_movie:
        return movie_read(request, title)
    else:
        return news_read(request, title)

def movie_read(request, title):
    # …

def news_read(request, title):
    # …

然后如果是 slug 则触发 my_view 函数:

path('<slug:title>/', views.<strong>my_view</strong>, name='news-movie-read'),

但更优雅的解决方案是简单地定义两个 非重叠 URL 模式:

path('<strong>news/</strong><slug:title>/', views.news_read,name='news_read'),
path('<strong>movie/</strong><slug:title>/', views.movie_read,name='movie_read'),

这也将防止 Movie 对象和 News 对象具有相同 url_title 的冲突,因为在这种情况下,它将始终使用 movie_read查看。