【问题标题】:Django using arguments in form action with CSRF tokenDjango 在表单操作中使用参数和 CSRF 令牌
【发布时间】:2013-11-20 05:56:44
【问题描述】:

我正在尝试创建一个用于更新联系人元素的表单。我想链接回 URL 的表单操作,但 URL 基于contact_id。当我尝试将 contact_id 变量添加到表单操作中时,我的 CSRF 令牌正在转义它,因此它不会将其作为变量读取。有没有办法绕过这个,还是我以错误的方式接近这个?

views.py

def contactedit(request, contact_id=1):
    if request.POST:
        contact = Contact.objects.get(id=contact_id)
        form = ContactForm(request.POST, instance=contact)
        if form.is_valid():
            form.save()

        return HttpResponseRedirect('/contact/{{ contact_id }}/')

    else:
        contact = Contact.objects.get(id=contact_id)
        form = ContactForm(instance=contact)

    args = {}
    args.update(csrf(request))

    args['form'] = form
    args['contact_id'] = contact_id

    return render_to_response('contactedit.html', args)

contactedit.html

<form action="/contact/{{ contact_id }}/edit/" method="post">{% csrf_token %}

错误
找不到页面 (404) 请求方法:GET 请求网址:(ipaddress)/contact/%7B%7B%20contact_id%20%7D%7D/

【问题讨论】:

    标签: django forms variables csrf args


    【解决方案1】:

    你的代码失败了

    return HttpResponseRedirect('/contact/{{ contact_id }}/')
    

    你在这里尝试使用模板语法,而不是你应该这样做

    return HttpResponseRedirect('/contact/'+str(contact_id))
    

    除此之外,当表单无效时,您的代码将不会处理大小写,并且会调用相同的代码。当表单无效时,您可能希望再次显示错误的表单。请参考 django 的表单处理文档。

    【讨论】:

    • 我想我完全误解了错误在哪里。你的建议解决了它。非常感谢。表单错误是我接下来要处理的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 2012-01-26
    • 2020-08-16
    • 2019-07-28
    • 2017-07-27
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多