Django重定向到上一页无效。
Django重定向到上一页无效。
你好,我想在提交表单后重定向到之前的页面。成功重定向到之前的页面,但是提交操作没有发生。如果我移除action属性,我可以成功提交数据。
以下是我的表单模板:
{% extends 'musicapp/base.html' %} {% block content %}
{% endblock %}
这是views.py文件:
from django.shortcuts import render, get_object_or_404, redirect, render_to_response
from django.http import HttpResponseRedirect
from .forms import AddTrackForm, AddGenreForm
from django.http import HttpResponse
from .models import Track, Genre
from . import getAlbumArt
def home(request):
tracks = Track.objects.all().order_by('created_date')
return render(request, 'musicapp/post_list.html', {'tracks': tracks})
def post_detail(request, pk):
track = get_object_or_404(Track, pk=pk)
return render(request, 'musicapp/post_detail.html', {'track': track})
def post_new(request):
if request.method == "POST":
form = AddTrackForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
artist = request.POST.get("artist", "")
album = request.POST.get("album", "")
urlArt = getAlbumArt.getAlbumArtURL(album, artist)
print urlArt
if urlArt:
post.cover_image_url = urlArt
if post.album == '*':
post.album = 'Unknown'
post.save()
tracks = Track.objects.all().order_by('created_date')
return render(request, 'musicapp/post_list.html', {'tracks': tracks})
else:
form = AddTrackForm()
return render(request, 'musicapp/post_edit.html', {'form': form})
def post_edit(request, pk):
post = get_object_or_404(Track, pk=pk)
if request.method == "POST":
form = AddTrackForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
artist = request.POST.get("artist", "")
album = request.POST.get("album", "")
urlArt = getAlbumArt.getAlbumArtURL(album, artist)
print urlArt
if urlArt:
post.cover_image_url = urlArt
if post.album == '*':
post.album = 'Unknown'
post.save()
tracks = Track.objects.all().order_by('created_date')
return redirect('post_detail', pk=post.pk)
else:
form = AddTrackForm(instance=post)
return render(request, 'musicapp/post_edit.html', {'form': form})
def genre(request):
tracks = Track.objects.all().order_by('created_date')
genres = Genre.objects.all()
return render(request, 'musicapp/genre.html', {'genres': genres, 'tracks': tracks})
def genre_songs(request, pk):
genres = Genre.objects.all()
genre_obj = get_object_or_404(Genre, pk=pk)
tracks = genre_obj.track_set.all()
return render(request, 'musicapp/genre_songs.html', {'genres': genres, 'genre' : genre_obj, 'tracks': tracks})
def genre_new(request):
if request.method == "POST":
form = AddGenreForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.save()
genres = Genre.objects.all()
next = request.POST.get('next', '/')
return render_to_response('musicapp/post_edit.html', {'form': AddTrackForm()})
else:
form = AddGenreForm()
return render(request, 'musicapp/genre_edit.html', {'form': form})
这些是URL路由:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.home, name='post_list'),
url(r'^track/(?P
url(r'^track/new/$', views.post_new, name='post_new'),
url(r'^track/(?P
url(r'^genre/$', views.genre, name='genre_list'),
url(r'^genre/(?P
url(r'^genre/new/$', views.genre_new, name='genre_new'),
]
问题原因:在urls.py文件中的正则表达式匹配出错导致重定向失败。
解决方法:将urls.py文件中的正则表达式进行修改,同时在表单中也需要相应地修改。
具体操作如下:
1. 将urls.py文件中的代码
url(r'^$', views.home, name='post_list'),
修改为
url(r'^postlist/$', views.home, name='post_list'),
2. 将表单中的代码
<form action="{% url 'post_list' %}" role="form">
修改为
<form action="/postlist" role="form" method="POST">
Django重定向到上一页无法正常工作的原因是:在表单中使用了错误的next值。表单中的隐藏输入域使用了request.path
,它提供的是当前页面的路径,而不是上一页的路径。因此,通过这种方式提交表单,实际上是将next值设为了表单所在页面的路径,而不是上一页的路径。
解决方法是使用{{ request.META.HTTP_REFERER }}
来获取上一页的路径。需要注意的是,这个值可能为None
,或者上一页可能来自另一个域名。
在这里,有人误解了action属性的含义,以为它只是在数据提交后重定向到给定的URL。现在可以看出为什么这样做不起作用了。但是通过使用request.path
,可以成功地重定向到上一页。
如果这个答案或其他答案解决了你的问题,请标记为已回答并按照你的意愿进行点赞。
如果在不同地方链接到同一个页面,并且想要根据表单URL的来源不同,将表单提交后重定向到不同的URL,可以考虑使用会话变量来实现。还有其他更简单的方法吗?
如果需要的话,你的视图函数也可以根据需要将数据提交到另一个URL,或者根据按钮的点击情况执行业务逻辑。在HTML中,如果使用带有value属性的命名输入元素(其值将显示在request.POST中),就可以知道用户点击了哪个按钮。可以参考这里的例子。但是需要注意的是,客户端的计算机不会同时将表单提交到两个URL,除非使用自定义的JavaScript。这不是HTML表单的常见行为。