一个奇怪的Django错误

时间:2011-11-10 10:55:55

标签: django

这是我的views.py:

# Create your views here.

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.db import models

    from display.forms import CodeForm
    from display.forms import CodeFormSet
    from ExamPy.questions.models import QuestionBase


    def codepost(request):
        if request.method == 'POST':
            form = CodeFormSet(request.POST)
            if form.is_valid():
                titles = []
                for i in range(0, self.total_form_count()):
                            form = self.forms[i]
                            title = form.cleaned_data['title']
                            if title in titles:
                                raise forms.ValidationError("Articles in a set must have distinct titles.")
                                titles.append(title)
                return render_to_response('quesdisplay.html')
        else:
            form = CodeFormSet()

        return render_to_response('quesdisplay.html', {'form':form})

因此,当我点击提交按钮时,它应该显示没有任何形式的quesdisplay.html。但是,它带我到一些甚至不存在的联系页面。

错误:

The current URL, contact/, didn't match any of these.

我已经尝试了所有可能的方法来调试它,但它不可能,因为在这里没有任何称为“联系”的痕迹。

编辑: 这是我得到的警告:

/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py:101: UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value.  This is usually caused by not using RequestContext.
  warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value.  This is usually caused by not using RequestContext.")
[10/Nov/2011 05:34:17] "

1 个答案:

答案 0 :(得分:3)

如之前的评论所示,使用Requestcontext解决您的问题。

以下是有关csrf_token的文档:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it

我们可以读到:

  

使用始终使用的RequestContext   'django.core.context_processors.csrf'(无论你的是什么   TEMPLATE_CONTEXT_PROCESSORS设置)。 如果您使用的是通用视图   或者contrib应用程序,您已经被覆盖,因为这些应用程序使用   整个RequestContext。

所以这里似乎我们没有使用通用视图,也不使用contrib应用程序。 所以我们需要它传递RequestContext,因为它就像在Django中使用csrf保护一样。

from django.core.context_processors import csrf
from django.shortcuts import render_to_response

def my_view(request):
    c = {}
    c.update(csrf(request))
    # ... view code here
    return render_to_response("a_template.html", c)

from django.views.generic.simple import direct_to_template

def app_view(request):             
    return direct_to_template(request, 'app_template.html', app_data_dictionary)

from django.shortcuts import render_to_response
from django.template import RequestContext

def app_view(request):
    return render_to_response('app_template.html', 
                              app_data_dictionary, 
                              context_instance=RequestContext(request))

此外,文档还提到:extras / csrf_migration_helper.py脚本。 似乎对您的案件有帮助:))

希望它有所帮助;)