首页 文章

为什么我自己的登录视图在Django中使用我自己的用户模型不起作用?

提问于
浏览
0

我在Django中创建了自己的用户模型:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    is_active = models.BooleanField(_('active'), default=False)
    token_num = models.IntegerField(_('token count'), default=0)
    money_num = models.IntegerField(_('money count'), default=0)

    objects = UserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

所以我决定做自己的登录视图 . 这里是:

def login(request):
if request.method == "POST":
    form = LoginForm(request.POST)
    email = request.POST.get('email')
    password = request.POST.get('password')
    user = authenticate(username=email, password=password)
    if user is not None and user.is_active:
        login(request, user)
        return HttpResponseRedirect("/main/")
else:
    form = LoginForm()
return render(request, 'registration/login.html', {'form': form})

这是我的LoginForm:

class LoginForm(forms.Form):
    user_email = forms.EmailField(max_length=255)
    password = forms.CharField(max_length=255)
    class Meta:
        model = User
        fields = ('email', 'password')

我的login.html:

{% extends 'base.html' %}

{% block title %}Login{% endblock %}
{% block content %}
<h2>Login</h2>
<form method="post">
  {% csrf_token %}
    {% for field in form %}
    <p>
      {{ field.label_tag }}<br>
      {{ field }}
      {% if field.help_text %}
        <small style="display: none">{{ field.help_text }}</small>
      {% endif %}
      {% for error in field.errors %}
        <p style="color:red">{{ error }}</p>
      {% endfor %}
    </p>
    {% endfor %}
  <button type="submit">Login</button>
</form>
{% endblock %}

这是我的urls.py:

urlpatterns = [
url(r'^log/$', views.login)
]

所以问题是,当我在登录页面输入所有数据时,用户没有重定向到主页面 . 登录页面正在重新加载,就是这样 . P.S我已经用电子邮件和密码创建了1个用户 . 此用户 is_active 设置为 True (1)

2 回答

  • 1

    我认为问题出在你的 LoginForm .

    它不是ModelForm,因此您可以删除Meta类 .

    您的电子邮件字段名为 user_email ,但在登录视图中,您尝试从POST参数获取 email .

    尝试获取一致的名称,您应该能够登录 .

  • 1

    您的LoginForm的字段为 user_email ,但您的代码从request.POST访问 email ;这些必须是一样的 .

    注意,您应该检查 form.is_valid() 并从 form.cleaned_data 获取数据,而不是直接从POST . 另请注意,您的表单(正确)不是ModelForm,因此内部Meta类及其内容无关紧要 .

相关问题