1

Django初心者はこちら!基本的にすべてのソリューションをオンラインで試しましたが、Opera と Firefox が代わりに「CSRF cookie が設定されていません」を返しているのに、まだエラー (1 つの Chrome)「CSRF トークンが見つからないか正しくない」が表示されます...? ここに私のファイルがあります:

ビュー.py

# views.py
from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login
from django.template import RequestContext
from django.core.context_processors import csrf

def dashboard(request):
    state = "log in"
    if request.user.is_authenticated():
        return render_to_response('memberbrd.html')
    elif request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/')
            else: 
                error = "inactive"
        else:
            error = "wrong username or password"
        render_to_response('visitorbrd.html', {'errors': error}, context_instance = RequestContext(request)) # I've also tried without context_instance, without passing errors...
    else:
        return render_to_response('visitorbrd.html')

urls.py

#urls.py
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

from mission.views import *

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', dashboard),
)

ビジターbrd.html

{% extends "base.html" %}
{% block content %}
    {% if state %}
        <p>{{ state }}</p>
    {% endif %}
    <form action="." method="POST">{% csrf_token %}
        <label for="username">User name:</label>
        <input type="text" name="username" value="" id="username">
        <label for="password">Password:</label>
        <input type="password" name="password" value="" id="password">
        <input type="submit" value="login" />
        <input type="hidden" name="next" value="{{ next|escape }}" />
    </form>
{% endblock %}

ありがとう !

4

2 に答える 2

3

実際にフォームを表示する責任がRequestContextあるファイナルには使用していません。render_to_response

于 2013-01-28T17:39:21.823 に答える
1

前の答えは絶対に正しいです。ただし、フォーム自体を出力するためにRequestContextは必要ありません。これはFormクラスによって処理されます。問題は、リクエストを介して新しいCSRFトークンを生成する必要があり、これはDjangoのミドルウェアを介して行われることです。ミドルウェアはコンテキスト変数にのみアクセスできるため、そのロジックにより、これを行うにはRequestContextが必要です。

ちなみに、私は「render_to_response」よりもDjangoの「render」関数の方が好きです。この関数が一般的すぎる場合もありますが、新しいユーザーにとっては、入力の節約になり、コードが非常にきれいに見えます。Djangoのサイトから例をコピーしました(以下にパーマリンクも含めます)。

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {"foo": "bar"},
        content_type="application/xhtml+xml")

Djangoドキュメント:ショートカット関数:レンダリング

于 2013-01-28T17:56:22.177 に答える