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

Django如何用request.user.username预填ModelChoiceField并保存用户数据

问题核心原因

预填充失效的核心问题是:ModelChoiceField 对应的初始值需要传递 User 模型实例,你当前传的是request.user.username字符串,类型不匹配导致表单无法正确识别选中项。同时原有代码还存在括号缺失、缩进错误、未处理未登录场景等问题,以下是完整修正方案:


1. forms.py 修正

补全原代码缺失的闭合括号,补充 ModelForm 必须的 Meta 配置:

from django import forms
from django.contrib.auth.models import User
from .models import SendM

class Send(forms.ModelForm):
    sender = forms.ModelChoiceField(queryset=User.objects.order_by('username'))
    
    class Meta:
        model = SendM
        fields = ['sender']
        # 如果你有其他需要用户填写的字段,一并加在fields列表里即可

2. views.py 修正

将初始值改为传递 User 实例,修正缩进错误,补充边界场景处理:

from django.shortcuts import render, redirect
from .forms import Send

def form_create(request):
    # 未登录用户跳转到登录页,避免后续逻辑报错
    if request.user.is_anonymous:
        return redirect('/login/')
    
    # initial 参数传入User实例而非username字符串
    form = Send(request.POST or None, initial={'sender': request.user})
    
    if request.method == "POST":
        if form.is_valid():
            # ModelForm 可直接保存,无需手动查询User构造实例
            form.save()
            return redirect("/")
    # 补充表单渲染返回逻辑,原代码缺失该部分
    return render(request, '你的表单模板路径.html', {'form': form})

如果你需要手动构造实例保存也可以,form.cleaned_data['sender'] 本身已经是查询好的 User 实例,不需要额外查库:

# 手动保存的写法示例
if form.is_valid():
    send = SendM(sender=form.cleaned_data['sender'])
    send.save()
    return redirect("/")

可选优化(更安全的实现)

如果 sender 字段不需要用户手动选择,完全由系统自动填充当前用户,建议直接去掉表单中的 sender 字段,避免前端被篡改提交:

调整后的 forms.py

class Send(forms.ModelForm):
    class Meta:
        model = SendM
        fields = [] # 只保留需要用户填写的字段,不要加sender

调整后的 views.py

def form_create(request):
    if request.user.is_anonymous:
        return redirect('/login/')
    form = Send(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            # 先不提交到数据库,手动赋值sender后再保存
            send = form.save(commit=False)
            send.sender = request.user
            send.save()
            return redirect("/")
    return render(request, '你的表单模板路径.html', {'form': form})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:06