我遇到了一个我无法找到解决方案的问题。我在导航栏中有一个按钮,可以在所有页面上使用,它是一个负责创建一些内容的按钮。
使用按钮查看该链接:
def createadv(request):
uw = getuw(request.user.username)
if request.method =='POST':
form = AdverForm(request.POST, request.FILES)
if form.is_valid():
form.instance.user = request.user
form.save()
return HttpResponseRedirect('/', {'username': request.user.username, 'uw': uw})
args = {}
args.update(csrf(request))
args['username'] = request.user.username
args['form'] = AdverForm()
args['uw'] = uw
return render_to_response('createadv.html', args)
如果您现在可以看到我总是重定向到主页' /'创建内容后,我想回到我启动内容创建的页面。
答案 0 :(得分:39)
您可以在表单中添加next
字段,并将其设置为request.path
。处理完表单后,您可以重定向到此路径的值。
template.html
<form method="POST">
{% csrf_token %}
{{ form }}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Let's Go</button>
</form>
views.py
next = request.POST.get('next', '/')
return HttpResponseRedirect(next)
如果我记得很清楚,这大致是django.contrib.auth
对登录表单的作用。
如果您通过中间页面,则可以通过查询字符串传递“下一个”值:
some_page.html
<a href="{% url 'your_form_view' %}?next={{ request.path|urlencode }}">Go to my form!</a>
template.html
<form method="POST">
{% csrf_token %}
{{ form }}
<input type="hidden" name="next" value="{{ request.GET.next }}">
<button type="submit">Let's Go</button>
</form>
答案 1 :(得分:12)
您可以使用HTTP_REFERER
值:
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
请注意,如果客户端禁用了发送引荐来源信息(例如,使用私有/隐身浏览器窗口),则此操作无效。在这种情况下,它会重定向到/
。
答案 2 :(得分:1)
你可以使用这个
return redirect(request.META.get('HTTP_REFERER'))
确保导入这个
from django.shortcuts import redirect
答案 3 :(得分:0)
如果这可以帮助某人,我可以在基于类的UpdateView中工作
模板
<form class="form" method="POST">
{% csrf_token %}
<!-- hidden form field -->
<input type="hidden" id="previous_page" name="previous_page"
value="/previous/page/url">
<!-- any other form fields -->
{{ form.name|as_crispy_field }}
{{ form.address|as_crispy_field }}
<!-- form submit button -->
<button class="btn btn-primary" type="submit" id="submit">Submit</button>
</form>
<!-- JS to insert previous page url in hidden input field -->
<script>
prev = document.getElementById("previous_page");
prev.value = document.referrer;
</script>
views.py
class ArticleUpdateView(generic.UpdateView):
model = Article
form_class = ArticleForm
template_name = 'repo/article_form.html'
def form_valid(self, form):
form.instance.author = self.request.user
# if form is valid get url of previous page from hidden input field
# and assign to success url
self.success_url = self.request.POST.get('previous_page')
return super().form_valid(form)
现在,该视图将您重定向到单击“更新/编辑”按钮的页面。所有URL查询参数也将保留。
答案 4 :(得分:0)
我最喜欢的方法是将request.path作为GET参数提供给表单。 发布时它将通过它,直到您重定向为止。 在基于类的视图(FormView,UpdateView,DeleteView或CreateView)中,您可以将其直接用作success_url。 我在某个地方读到,混合使用GET和POST是不好的做法,但是它的简单性使其成为我的例外。
示例urls.py:
urlpatterns = [
path('', HomeView.as_view(), name='home'),
path('user/update/', UserUpdateView.as_view(), name='user_update'),
]
链接到模板内部的表单:
<a href="{% url 'user_update' %}?next={{ request.path }}">Update User</a>
基于类的视图:
class UserUpdateView(UpdateView):
...
def get_success_url(self):
return self.request.GET.get('next', reverse('home'))
在基于函数的视图中,可以按以下方式使用它:
def createadv(request):
uw = getuw(request.user.username)
if request.method =='POST':
form = AdverForm(request.POST, request.FILES)
if form.is_valid():
form.instance.user = request.user
form.save()
next = request.GET.get('next', reverse('home'))
return HttpResponseRedirect(next)
args = {}
args.update(csrf(request))
args['username'] = request.user.username
args['form'] = AdverForm()
args['uw'] = uw
return render_to_response('createadv.html', args)