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

Django存储数据至模型触发ValueError:需传入User实例而非用户名

问题描述

models.py 代码

class PostData(models.Model):
    #image = models.ImageField(upload_to="")
    title_name = models.CharField(max_length=255)
    description = models.CharField(max_length=10000)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

views.py 代码

def createPost(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        print(form.is_valid())
        if form.is_valid():
            # 从网页提取数据
            title = form.cleaned_data['title_name']
            description = form.cleaned_data['description']
            # 获取会话中存储的用户名
            author = request.session.get("username")
            print(author)
            print(title)
            # 存储数据
            PostData.objects.create(title_name=title, description=description, author=author)

报错信息

ValueError at /create/
Cannot assign "'dhruv123'": "PostData.author" must be a "User" instance.


解决方法

错误核心原因:PostData.author字段要求传入User模型的实例对象,但你现在传的是字符串格式的用户名,类型不匹配导致报错。以下是两种直接可行的修复方式:

方式一:通过用户名查询User实例

从会话拿到用户名后,先查询对应的User对象,再传入创建方法:

def createPost(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['title_name']
            description = form.cleaned_data['description']
            username = request.session.get("username")
            # 根据用户名获取User实例
            try:
                author = User.objects.get(username=username)
                PostData.objects.create(title_name=title, description=description, author=author)
                # 这里可添加重定向或成功提示逻辑
            except User.DoesNotExist:
                # 处理用户名不存在的异常,比如返回错误页面
                pass

方式二:直接使用request.user(更推荐)

如果你的项目配置了Django认证系统,用户登录后request.user就是当前登录的User实例,无需从session取用户名,代码更简洁安全:

def createPost(request):
    # 先校验用户是否登录,避免匿名提交
    if not request.user.is_authenticated:
        return redirect('login')  # 跳转到登录页或返回错误
    
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['title_name']
            description = form.cleaned_data['description']
            # 直接传入User实例
            PostData.objects.create(title_name=title, description=description, author=request.user)
            # 后续逻辑(如重定向到文章列表页)

额外优化:用ModelForm简化代码

可以把PostForm改成ModelForm,减少手动提取字段的代码:

# forms.py
from django import forms
from .models import PostData

class PostForm(forms.ModelForm):
    class Meta:
        model = PostData
        fields = ['title_name', 'description']  # 排除author,后端手动赋值

对应的views代码可简化为:

def createPost(request):
    if not request.user.is_authenticated:
        return redirect('login')
    
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)  # 暂不保存到数据库
            post.author = request.user  # 手动设置作者
            post.save()  # 完成保存
            # 重定向到目标页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:33:16