Django使用CSRF令牌在表单操作中使用参数

时间:2013-11-08 09:20:34

标签: django forms variables csrf args

我正在尝试创建一个用于更新联系人元素的表单。我希望链接回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)/联系人/%7B%7B%20contact_id%20%7D%7D /

1 个答案:

答案 0 :(得分:2)

您的代码失败

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

您正在尝试使用模板语法,而不应该使用

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

除了表单无法处理表单无效并将调用相同代码的情况。当表单无效时,您可能希望再次显示表单并出现错误。请参阅django的表格处理文档。