我想在两个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"),
但是这看起来不太好我不知道该怎么解决这个问题
Django会" fire ";匹配URL的第一个路径。这就意味着你每输入一个子弹,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
函数,如果它是一个段塞:
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
视图。
我觉得你的url路径是相同的,这就是为什么django选择错误的视图。尝试将url更改为:路径(新闻/段塞:标题/,views.news_read, name ="news_read"),路径(电影/段塞:标题/,views.movie_read, name ="movie_read"),