Django表单提交后数据未入库,需自动填充user字段
问题与解决方案
问题现象
点击提交按钮后终端显示存在POST请求,但数据库中未生成新的PinModel数据,需要自动将提交表单的当前用户填充至PinModel的user字段。
问题原因
- 表单未处理文件上传:表单包含ImageField,但form标签未添加
enctype="multipart/form-data",导致图片上传失败,表单验证不通过,无法触发数据保存。 - user字段未赋值:PinModel的user字段为必填项(无
null=True设置),但表单未包含该字段,视图也未自动为其赋值,即使表单验证通过,保存时会因user字段为空报错。 - 未限制登录访问:若用户未登录,
request.user为匿名用户,直接赋值会触发数据库约束错误,且不符合业务逻辑。
解决方案
1. 修改HTML表单,添加文件上传编码类型
在form标签中补充enctype="multipart/form-data"属性:
<section class="create-pin-section"> <div class="create-pin-div"> <h2>Create Pin</h2> <form action="{% url 'create-pin' %}" class="create-pin-form" method="post" enctype="multipart/form-data"> {% csrf_token %} <label for="{{ form.image.id_for_label }}">Choose Pic</label> {{ form.image }} <label for="{{ form.name.id_for_label }}">Choose da name</label> {{ form.name }} <label for="{{ form.description.id_for_label }}">Choose da description</label> {{ form.description }} <label for="{{ form.tags.id_for_label }}">Choose da tags</label> {{ form.tags }} <button type="submit">Create</button> </form> </div> </section>
2. 修改视图,自动填充user字段并限制登录访问
继承LoginRequiredMixin确保仅登录用户可访问,重写form_valid方法为user字段赋值:
from django.contrib.auth.mixins import LoginRequiredMixin class CreatePinView(LoginRequiredMixin, CreateView): model = PinModel form_class = PinCreationForm template_name = 'pinapp/create-pin.html' success_url = reverse_lazy('users:login') def form_valid(self, form): # 将当前登录用户赋值给表单实例的user字段 form.instance.user = self.request.user return super().form_valid(form)
补充说明
LoginRequiredMixin会自动引导未登录用户跳转至登录页面(若需自定义登录页地址,可在视图中添加login_url属性)。form_valid方法在表单验证通过后、数据入库前执行,此时为form.instance赋值会被同步保存至数据库。- 需确保项目已正确配置媒体文件存储(在settings.py中设置
MEDIA_ROOT和MEDIA_URL),否则图片无法正常上传保存。
内容的提问来源于stack exchange,提问作者Whsar
相关产品推荐
相关产品推荐

