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

Django待办应用问题:get_user_model无法获取当前登录用户值

解决Django待办应用中用户关联任务的问题

嘿,我一眼就看出问题出在哪啦!你遇到的added_by字段必填错误,主要是两个原因:

  1. 你的表单设置了fields = '__all__',这意味着表单会包含added_by这个外键字段,但你在模板里根本没渲染它,提交时自然是空值,触发必填校验;
  2. 就算表单里去掉这个字段,你直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:02:32