You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+MySQL自定义用户体系下如何自动绑定登录用户为发帖作者

解决方案

第一步:修改表单定义(forms.py)

将author字段从表单校验列表中移除,避免前端需要提交该字段值:

class Sublist(forms.ModelForm):
    class Meta:
        model = sublist
        # 仅保留需要用户手动填写的字段,移除author
        fields = ["name", "cost", "renewalcycle"]

第二步:完善登录逻辑存储用户身份

在你的登录验证逻辑中,邮箱密码校验通过后需要将当前登录用户的ID存入session,方便后续请求获取身份:

# 以下为登录视图的核心逻辑示例,可适配你原有的登录代码调整
def login(request):
    if request.method == 'POST':
        form = Studentlogin(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            input_pwd = form.cleaned_data['password']
            try:
                student = students.objects.get(email=email)
                # 密码校验通过后存储用户ID到session
                if student.password == input_pwd:
                    request.session['student_id'] = student.id
                    # 跳转主页等后续逻辑
            except students.DoesNotExist:
                # 账号不存在的错误提示逻辑
                pass
    # 其他原有逻辑

第三步:修改发帖视图(views.py的addnew函数)

  1. 给addnew增加登录校验装饰器,确保仅登录用户可访问
  2. 表单校验通过后先不直接保存,手动注入当前登录用户为author后再提交数据
  3. 修复原有代码中name变量未定义的问题
    修改后的代码如下:
# 注意如果你用的是Django默认的login_required装饰器,需要替换为适配自定义用户体系的登录校验装饰器,确保session中存在student_id才允许访问
@login_required(login_url='login')
@cache_control(no_cache=True, must_revalidate=True, no_store=True) 
def addnew(request):
    if request.method == 'POST':
        form = Sublist(request.POST)
        if form.is_valid():
            try:
                # 先构造实例不提交到数据库
                sub_item = form.save(commit=False)
                # 从session获取当前登录用户,赋值为作者
                current_user = students.objects.get(id=request.session['student_id'])
                sub_item.author = current_user
                # 正式保存到数据库
                sub_item.save()
                messages.success(request, '订阅保存成功')
                return render (request, 'subscrap/main.html', {'sublist': sub_item})
            except:
                messages.error(request, '保存失败')
        else:
            messages.error(request, '表单填写有误')
    else:
        form = Sublist()
    return render(request, 'subscrap/addnew.html', {'form': form})

额外优化建议

当前你的用户密码为明文存储,存在严重安全风险,建议使用Django自带的密码加密工具处理:

  • 存储密码时调用make_password(原始密码)生成加密串后再存入数据库
  • 校验密码时调用check_password(用户输入的明文密码, 数据库存储的加密串)做对比

内容的提问来源于stack exchange,提问作者zayant21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:45:03