如何使用Django创建动态HttpResponseRedirect?

时间:2013-09-03 18:22:01

标签: python django

我有两个共享一个包含标签的网址,在包含标记内我有另一个显示表单的网址,此表单重定向到两个网址之一。 如何使此重定向动态化? 例如。如果表单在url_1中重定向到url_1,并且url_2中的表单是否重定向到url_2?

以下是我的代码以获得更好的解释(希望如此):

form.html

# This form lives inside of an inclusion tag, so many urls could display it
<form method="POST" action={% url cv_toggle %}>
    <input type="hidden" name="c_id" value={{ c.id }}>
    ...
    {% csrf_token %}
</form>

views.py

# corresponds to name="cv_toggle" as a url
def toggle_vote(request):
    ...
    next = reverse("frontpage") # this url should redirect to the current
                                # url requested, and not just "frontpage"
    return HttpResponseRedirect(next)

1 个答案:

答案 0 :(得分:1)

您可以使用请求对象来确定当前的URL,如下所示:

<form method="POST" action="...">
    <input type="hidden" name="next" value="{{ request.get_full_path }}">
    ...
    {% csrf_token %}
</form>

查看:

from django.utils.http import is_safe_url

def toggle_vote(request):
    ...
    next_url = request.POST.get('next')

    if not next_url or not is_safe_url(url=next_url, host=request.get_host()):
        next_url = reverse('frontpage')
    return HttpResponseRedirect(next_url)

Django登录表单使用这样的next字段来确定登录后重定向用户的位置。您可以将此URL也存储为GET参数而不是POST,或者您可以使用它们以获得更好的灵活性和更容易的测试。