Представления разные, но отображается один и тот же шаблон

я хочу использовать поле slug в обоих url, которое является

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

но это выглядит не очень хорошо есть идеи что делать как решить проблему

Похоже, что путь к url одинаковый, поэтому django выбирает неправильный вид. Попробуйте изменить урлы на такие: path('news/slug:title/',views.news_read,name="news_read"), path('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):
    # …

и, таким образом, вызвать функцию my_view, если это slug:

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

но более элегантным решением является простое определение двух непересекающихся шаблонов URL:

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

Это также предотвратит столкновения, когда объект Movie и объект News имеют одинаковые url_title, поскольку в этом случае всегда будет использоваться представление movie_read.

Вернуться на верх