想要设计一个注册、登录界面,但是无法实现,发现数据无法保存到数据库中
二改:
debug后发现是数据库中的Author表无法导入,当我把位置改为绝对路径时(from author.models import Author)显示我环境变量配置有问题:django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
什么问题?
这是我的视图函数
def author_register_login(request):
message = None
form = AuthorRegisterForm() # 初始化一个空的表单对象
if request.method == 'POST':
# 处理注册表单
if request.POST.get('form_type') == 'register':
form = AuthorRegisterForm(request.POST)
if form.is_valid():
try:
# 创建用户
new_author = Author(
username=form.cleaned_data['username'],
password=make_password(form.cleaned_data['password']),
status='0'
)
new_author.save()
return render(request,'home.html')
except:
messages.error(request, '填写有误,请重新填写')
# 处理登录表单
elif request.POST.get('form_type') == 'login':
username = request.POST.get('username')
password = request.POST.get('password')
# 在数据库中查找该用户名的作者
author = Author.objects.filter(username=username).first()
# 如果找到了作者并且密码正确
if author and author.check_password(password):
# 将作者设置为登录状态
request.session['author_id'] = author.id
# 重定向到首页
return render(request,'home.html')
else:
messages.error(request, '用户名或密码错误')
else:
form = AuthorRegisterForm()
return render(request, 'login.html', {'form': form, 'message': message})
这是我的注册表单,forms.py
```python
from django import forms
from django.utils.translation import gettext_lazy as _
from .models import Author
def get_data_tooltip(info):
"""表单元素数据提示,主要是添加Bootstrap前端框架中提供的提示功能属性"""
return {
'data-toggle': 'tooltip',
'data-trigger': 'hover',
'data-delay': {'show': 500, 'hide': 100},
'data-placement': 'top',
'data-original-title': _(info),
'class': 'form-control'
}
class AuthorRegisterForm(forms.ModelForm):
"""用户注册表单"""
# 确认密码
confirm_password = forms.CharField(label='确认密码', min_length=6, max_length=18,
widget=forms.PasswordInput)
def clean_confirm_password(self):
"""确认密码验证"""
password = self.cleaned_data['password']
confirm_password = self.cleaned_data['confirm_password']
if password != confirm_password:
raise forms.ValidationError('两次密码输入不一致,请重新注册')
return confirm_password
class Meta:
# 表单关联数据模型
model = Author
# 表单展示字段
fields = ['username', 'password', 'confirm_password']
# 指定表单视图组件
widgets = {
'username': forms.TextInput(
attrs=get_data_tooltip('请输入6~18位字母、数字、下划线组成的账号')
),
'password': forms.PasswordInput(
attrs=get_data_tooltip('请输入6~18位密码')
),
'confirm_password': forms.PasswordInput(
attrs=get_data_tooltip('再次确认密码')
),
}
# 表单提示信息
# 错误提示信息
error_messages = {
'username': {
'unique': '该账号已经存在,请使用其他账号注册'
}
}
class AuthorLoginForm(forms.ModelForm):
class Meta:
model = Author
fields = ['username', 'password']
widgets = {
'username': forms.TextInput(attrs=get_data_tooltip('请输入您的账号')),
'password': forms.PasswordInput(attrs=get_data_tooltip('请输入密码'))
}
def clean(self):
username = self.cleaned_data['username']
password = self.cleaned_data['password']
try:
author = Author.objects.get(username=username, password=password)
return author.__dict__
except:
raise forms.ValidationError("账号或者密码有误,请重新登录")
这是html中相对应的form
<form action="{% url 'author:author_register_login'%}" method="POST">
{% csrf_token %}
<h1>登录</h1>
<input type="text" name="username" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="submit" class="btn" value="登 录">
</form>
<form action="{% url 'author:author_register_login'%}" class="sign" method="POST">
{% csrf_token %}
<h1>注册</h1>
<!--{{ author_register_form.username }}
{{ author_register_form.password }}
{{ author_register_form.confirm_password }}-->
<input type="text" name="username" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="password" name="confirm_password" placeholder="确认密码">
<input type="submit" class="btn" value="注 册">
</form>
请问是哪里出了问题?
这是部分模型代码:
```python
class Author(models.Model):
"""用户类型:博客作者"""
objects = None
GENDER = {
('0', '女'),
('1', '男'),
}
STATUS = {
('0', '正常'),
('1', '锁定'),
('2', '删除'),
}
# objects = None
"""作者编号"""
# id = models.AutoField(primary_key=True, verbose_name='作者编号')
"""这里使用UUIDField唯一标识符"""
id = models.UUIDField(primary_key=True, auto_created=True, default=uuid.uuid4)
"""登录账号"""
username = models.CharField(max_length=50, verbose_name='登录账号',
unique=True, db_index=True)
"""登录密码"""
password = models.CharField(max_length=50, verbose_name='登录密码')