我在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 回答
我认为问题出在你的
LoginForm
.它不是ModelForm,因此您可以删除Meta类 .
您的电子邮件字段名为
user_email
,但在登录视图中,您尝试从POST参数获取email
.尝试获取一致的名称,您应该能够登录 .
您的LoginForm的字段为
user_email
,但您的代码从request.POST访问email
;这些必须是一样的 .注意,您应该检查
form.is_valid()
并从form.cleaned_data
获取数据,而不是直接从POST . 另请注意,您的表单(正确)不是ModelForm,因此内部Meta类及其内容无关紧要 .