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
相关产品推荐
相关产品推荐

