Представления разные, но отображается один и тот же шаблон
я хочу использовать поле 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
.