Django重定向到上一页无效。

13 浏览
0 Comments

Django重定向到上一页无效。

你好,我想在提交表单后重定向到之前的页面。成功重定向到之前的页面,但是提交操作没有发生。如果我移除action属性,我可以成功提交数据。

以下是我的表单模板:

{% extends 'musicapp/base.html' %} {% block content %}

{% csrf_token %}

添加类型

{{ form.name }}

{% 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\d+)/$', views.post_detail, name='post_detail'),

url(r'^track/new/$', views.post_new, name='post_new'),

url(r'^track/(?P\d+)/edit/$', views.post_edit, name='post_edit'),

url(r'^genre/$', views.genre, name='genre_list'),

url(r'^genre/(?P\d+)/$', views.genre_songs, name='genre_songs'),

url(r'^genre/new/$', views.genre_new, name='genre_new'),

]

0
0 Comments

问题原因:在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">

0
0 Comments

问题的原因是有两个嵌套的表单,内部表单使用GET方法,外部表单使用POST方法。这种混乱的做法是错误的,需要进行修复。修复后,这个问题应该也会解决。

解决方法是不要直接使用{{ request.META.HTTP_REFERER }}来获取前一页的地址,因为它并不一定是你所想要的前一页。可以通过使用GET方法,比如通过'?prev=/url/before/form/'来记录用户来自哪个页面。

我没有注意到HTML中有两个form标签。可能是因为我从其他表单的HTML中复制粘贴时漏掉了这一点。感谢你纠正了这个错误。

0
0 Comments

Django重定向到上一页无法正常工作的原因是:在表单中使用了错误的next值。表单中的隐藏输入域使用了request.path,它提供的是当前页面的路径,而不是上一页的路径。因此,通过这种方式提交表单,实际上是将next值设为了表单所在页面的路径,而不是上一页的路径。

解决方法是使用{{ request.META.HTTP_REFERER }}来获取上一页的路径。需要注意的是,这个值可能为None,或者上一页可能来自另一个域名。

在这里,有人误解了action属性的含义,以为它只是在数据提交后重定向到给定的URL。现在可以看出为什么这样做不起作用了。但是通过使用request.path,可以成功地重定向到上一页。

如果这个答案或其他答案解决了你的问题,请标记为已回答并按照你的意愿进行点赞。

如果在不同地方链接到同一个页面,并且想要根据表单URL的来源不同,将表单提交后重定向到不同的URL,可以考虑使用会话变量来实现。还有其他更简单的方法吗?

如果需要的话,你的视图函数也可以根据需要将数据提交到另一个URL,或者根据按钮的点击情况执行业务逻辑。在HTML中,如果使用带有value属性的命名输入元素(其值将显示在request.POST中),就可以知道用户点击了哪个按钮。可以参考这里的例子。但是需要注意的是,客户端的计算机不会同时将表单提交到两个URL,除非使用自定义的JavaScript。这不是HTML表单的常见行为。

0