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

问题描述 投票:0回答:2

我在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)

python django django-models django-forms
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类及其内容无关紧要。


推荐问答