嗨我想在django中提交表单后重定向到上一个 . 它成功重定向到上一页但没有发生后期操作 . 如果删除action属性,我可以成功发布数据 .
这是我的表单模板 .
{% extends 'musicapp/base.html' %} {% block content %}
<!-- <h1>New post</h1> -->
<form method="POST" action={{ request.META.HTTP_REFERER }} class="post-form">{% csrf_token %}
<div class="add_track_form" >
<div class="col-sm-6">
<section class="panel panel-default">
<header class="panel-heading font-bold">Add Genre</header>
<div class="panel-body">
<form action="{% url 'post_list' %}" role="form">
<div class="form-group">
<label>Title</label>
{{ form.name }}
</div>
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit" class="btn btn-sm btn-default">Submit</button>
</form>
</div>
</section>
</div>
</div>
</form>
{% 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
# Create your views here.
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)
# print post
return render(request, 'musicapp/post_detail.html', {'track': track})
# def post_new(request):
# form = AddTrackForm()
# return render(request, 'musicapp/post_edit.html', {'form': form})
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", "")
# print artist, 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", "")
# print artist, 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()
# print post
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()
print request.META.HTTP_REFERER
next = request.POST.get('next', '/')
# return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
# print next
# return HttpResponseRedirect(next)
# return HttpResponseRedirect('/')
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<pk>\d+)/$', views.post_detail, name='post_detail'),
url(r'^track/new/$', views.post_new, name='post_new'),
url(r'^track/(?P<pk>\d+)/edit/$', views.post_edit, name='post_edit'),
url(r'^genre/$', views.genre, name='genre_list'),
url(r'^genre/(?P<pk>\d+)/$', views.genre_songs, name='genre_songs'),
url(r'^genre/new/$', views.genre_new, name='genre_new'),
]
5 回答
替换你的urls.py
同
并以您的形式
成为
看看这个:
request.path
提供 current 页面的路径,而不是之前的路径 . 因此,您当前正在提交表单提交的同一页面的下一个值 .{{ request.META.HTTP_REFERER }}
提供引用页面 . 那么为什么要将表单发布到上一页呢?但应该注意,这可能具有None
的值(或者引用页面可能来自另一个域) .我假设您有表单的动作参数,并且您的“下一个”隐藏输入的值已切换 . 否则,您可能会有不必要的复杂逻辑 .
你有两种形式,它们是嵌套的 . 内部表单使用GET(如果没有指定,则默认使用GET),外部表单使用POST . 这纯粹是混乱,你不应该这样做 . 如果你解决这个问题,我相信这个错误也会得到解决 .
{{ request.META.HTTP_REFERER }}
不一定是您考虑的上一页 . 你不应该这样使用它 . 我会使用GET(例如'?prev=/url/before/form/'
)来记住用户来自哪个页面 .所以我通过比较我们点击链接的URL然后根据以前的URL
(request.META.HTTP_REFERER)
设置隐藏字段并根据我从模板获得的标志值重定向来解决我的问题 .这是我的模板
这是视图功能:
有更简单的方法吗?
我认为我有一个更简单的方法 .
模板:
视图:
所以,我们总是有第一个网址