视图不同但呈现相同的模板
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
查看。
我想在两个 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
查看。