首页 文章

Django模板错误?

提问于
浏览
0

我正在尝试使用django-registration,django-registration-defaults和django-email-usernames为我的django应用程序实现注册和登录系统 .

一切安装得很好 . django-email-usernames提供自定义登录表单,允许将电子邮件用作用户名 . 这是表单的代码 .

from django import forms
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import authenticate

...

class EmailLoginForm(forms.Form):
    email = forms.CharField(label=_(u"Email"), max_length=75, widget=forms.TextInput(attrs=dict(maxlength=75)))
    password = forms.CharField(label=_(u"Password"), widget=forms.PasswordInput)

    def clean(self):
        # Try to authenticate the user
        if self.cleaned_data.get('email') and self.cleaned_data.get('password'):
            user = authenticate(username=self.cleaned_data['email'], password=self.cleaned_data['password'])
            if user is not None:
                if user.is_active:
                    self.user = user # So the login view can access it
                else:
                    raise forms.ValidationError(_("This account is inactive."))
            else:
                raise forms.ValidationError(_("Please enter a correct username and password. Note that both fields are case-sensitive."))

        return self.cleaned_data

在django-registration的urls.py中,有登录页面的模式 . 它使用默认的django.contrib.auth.views.login视图进行登录 .

所以在urls.py我得到了这个:

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
from django.contrib.auth import views as auth_views
from registration.views import activate
from registration.views import register

from email_usernames.forms import EmailLoginForm

...

url(r'^login/$', auth_views.login, {'template_name': 'registration/login.html', 'authentication_form': EmailLoginForm}, name='auth_login'),

...

django.contrib.auth.views.login接受要使用的template_name和表单 . 正如你在上面所看到的那样,我正在传递这些内容 . 我正在设置模板并将authentication_form设置为django-email-usernames提供的模板 .

然后当浏览到登录页面时,我收到以下错误:

在/ accounts / login /上的TemplateSyntaxError在渲染时捕获了AttributeError:'WSGIRequest'对象没有属性'get'

模板错误

在模板/Users/Amir/.virtualenvs/scvd/lib/python2.6/site-packages/registration_defaults/templates/registration/login.html中,第16行的错误在渲染时捕获了AttributeError:'WSGIRequest'对象没有属性'get “

6   {% endif %}
7   
8   <form method="post" action="{% url django.contrib.auth.views.login %}">{% csrf_token %}
9   <table>
10  <tr>
11      <td>{{ form.username.label_tag }}</td>
12      <td>{{ form.username }}</td>
13  </tr>
14  <tr>
15      <td>{{ form.password.label_tag }}</td>
16      <td>{{ form.password }}</td>
17  </tr>
18  </table>
19  <p><a href="{% url auth_password_reset %}">Forgot</a> your password?  <a href="{% url registration_register %}">Need an account</a>?</p>
20  
21  <input type="submit" value="login" />
22  <input type="hidden" name="next" value="{{ next }}" />
23  </form>
24  
25  {% endblock %}
26

我很困惑 . 我很确定我正确配置了urls.py配置 . 我不理解模板中第16行({})发生的错误 .

请让我知道我还能提供什么来澄清我的问题 . 非常感谢你的帮助 .

1 回答

  • 0

    似乎你的clean()不是那么清楚

    user = authenticate(username=self.cleaned_data['email'], password=self.cleaned_data['password'])
    

    有.get缺失

    user = authenticate(username=self.cleaned_data.get['email'], password=self.cleaned_data.get['password'])
    

    这是一个很好的做法

    def clean(self):
         x = self.cleaned_data.get("username")
         y = self.cleaned_data.get("password")
    

    然后你可以使用

    user = authenticate(username=x, password=y)
    

相关问题