Django待办应用问题:get_user_model无法获取当前登录用户值
解决Django待办应用中用户关联任务的问题
嘿,我一眼就看出问题出在哪啦!你遇到的added_by字段必填错误,主要是两个原因:
- 你的表单设置了
fields = '__all__',这意味着表单会包含added_by这个外键字段,但你在模板里根本没渲染它,提交时自然是空值,触发必填校验; - 就算表单里去掉这个字段,你直接调用
form.save()的时候,也没有给Task实例的added_by赋值当前登录用户,数据库同样会报错。
下面是具体的修复步骤,一步步来:
1. 修改表单,排除added_by字段
我们不需要让用户手动选择自己,这个字段应该由后台自动填充,所以在forms.py里调整表单的字段配置:
from django import forms from .models import Task class TaskForm(forms.ModelForm): class Meta: model = Task # 只包含需要用户输入的字段,排除added_by fields = ['title', 'completed'] widgets = { 'title': forms.TextInput(attrs={'class': 'new_task_text', 'placeholder': 'Add new task'}), }
或者用exclude = ['added_by']效果一样,选你觉得舒服的写法就行。
2. 在视图中手动关联当前登录用户
当表单验证通过后,不要直接保存,先创建未提交的实例,把当前用户赋值给added_by,再保存到数据库。修改views.py里的POST处理逻辑:
@login_required def list_homepage(request): # 只显示当前用户的任务,而不是所有任务 tasks = Task.objects.filter(added_by=request.user) form = TaskForm() if request.method == 'POST': form = TaskForm(request.POST) if form.is_valid(): # commit=False表示创建实例但不保存到数据库 task = form.save(commit=False) # 给added_by赋值当前登录用户 task.added_by = request.user task.save() print(form.cleaned_data) else: print(form.errors) return redirect('/list/home') context = { 'page_title': 'Todo list', 'tasks': tasks, 'form': form, } return render(request, 'tasks/list.html', context)
另外我还帮你改了tasks的查询逻辑——原来的Task.objects.all()会把所有用户的任务都显示出来,改成filter(added_by=request.user)后,用户只能看到自己创建的任务,更符合你的需求。
为什么这么做?
get_user_model()本身是没问题的,它确实返回了你的用户模型,问题出在你没有给字段赋值;commit=False是Django表单的常用技巧,用来在保存前给模型实例补充额外的字段值,比如这里的用户关联;- 把
added_by从表单里排除,避免了前端不必要的字段渲染,也保证了数据安全性(用户不能篡改这个字段的值)。
这样修改后,你提交表单就不会再出现那个必填错误了,而且每个任务都会正确关联到创建它的用户~
内容的提问来源于stack exchange,提问作者kczan
相关产品推荐
相关产品推荐

