Epiphany131 2023-03-28 16:45 采纳率: 78.9%
浏览 50
已结题

django实现用户注册和登录问题

想要设计一个注册、登录界面,但是无法实现,发现数据无法保存到数据库中
二改:
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='登录密码')

  • 写回答

3条回答 默认 最新

  • 小小小小人水豚 2023-03-28 17:41
    关注

    这里只有校验通过的逻辑,加上else看看报什么错了

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 修改了问题 3月28日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 MATLAB动图问题
  • ¥15 有段代码不知道怎么理解,const isToken = (config.headers || {}).isToken === false
  • ¥100 采用栈和深度优先算法对我的代码进行修改显示路径
  • ¥15 pointnet2包安装
  • ¥20 射频功率问题,解答者有酬谢!
  • ¥80 构建降雨和积水的预测模型
  • ¥15 #Qt Transform setTransform()在鼠标拖动移动视角是一致在原地不动,无法变换视角(细微观察似乎视图有在原地抖动),无法变换视角(细微观察似乎视图有在原地抖动)
  • ¥50 如何利用无人机拍摄的数码照片测量鸟卵的长短径
  • ¥100 github贡献者给与奖励
  • ¥15 使用DS18B20+ESP8266获取温度数据返回-127.00