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函数)
- 给
addnew增加登录校验装饰器,确保仅登录用户可访问 - 表单校验通过后先不直接保存,手动注入当前登录用户为
author后再提交数据 - 修复原有代码中
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
相关产品推荐
相关产品推荐

