简体   繁体   English

Django麻烦表单和CSRF令牌

[英]Django troubles with forms and csrf tokens

I'm trying to get a pretty simple email form working. 我正在尝试使用一个非常简单的电子邮件表单。 The form is only one field (email). 该表格仅是一个字段(电子邮件)。

forms.py 表格

from django import forms

class EmailForm(forms.Form):
    email = forms.EmailField()

views.py views.py

from django.shortcuts import render_to_response
from django.core.mail import EmailMultiAlternatives
from django.template import RequestContext
from launchpage.models import EmailForm

def index(request):
    if request.method == 'POST':        
        form = EmailForm(request.POST)
        if form.is_valid():
            clean_data = form.clean_data
            # send an email
                    thank_you = "Thanks for signing up"
            return render_to_response('launch.html', {'thank_you': thank_you})
    else:
        form = EmailForm()
    return render_to_response('launch.html', {'form': form,}, context_instance=RequestContext(request))

launch.html (relevant part) launch.html (相关部分)

<div class="row-fluid">
    <div class="span12">
        {% if thank_you %}
             <div class="alert alter-info">
             {{ thank_you }}
             </div>
        {% else %}
            <form action="" method="post" class="form-horizontal">{% csrf_token %}
            Or stay updated by email (no spam, pinky swear) &nbsp;&nbsp;
            {{ form.email }}
            <button type="submit" class="btn">Submit</button>
        </form>
        {% endif %}
    </div>
</div>

middleware in settings.py settings.py中的中间件

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Current result: the page displays as if there was no templating involved. 当前结果:页面显示好像没有模板。 I see the form and the submit button is there, but no email field. 我看到表单和“提交”按钮在那里,但是没有电子邮件字段。 Also no csrf hidden field. 也没有csrf隐藏字段。 I must be missing something stupid... 我一定想念一些愚蠢的东西...

Assuming that this: 假设这样:

from launchpage.models import EmailForm

shouldn't be from launchpage.forms import EmailForm 不应from launchpage.forms import EmailForm

The other problem you have is {'form': form,} needs to be {'form': form} 您遇到的另一个问题是{'form': form,}必须是{'form': form}

Finally, {{ form.email }} should be simply {{ form }} 最后, {{ form.email }}应该只是{{ form }}

Final tip - consider using the render shortcut which sends the appropriate request context automatically. 最后一点-考虑使用render快捷方式 ,该快捷方式会自动发送适当的请求上下文。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM