Django表单外键下拉仅展示当前用户录入数据报错如何解决
问题原因
你遇到的报错核心有3个问题:
- 你的
Nomination模型没有定义user字段,仅存在存储创建人信息的createdby字段,直接调用self.instance.user必然会触发属性不存在的报错 - 表单逻辑和需求不匹配:你需要限制的是
Nomination表单中外键category的下拉选项,当前你写的CategoryForm、过滤Award表的逻辑完全和需求错位 - 表单本身无法直接获取当前登录的用户信息,需要你从视图层主动把用户对象传递给表单
解决方案
第一步:修改表单类
调整表单逻辑,新增接收用户参数的逻辑,限制分类下拉选项仅展示当前用户创建的内容:
# forms.py from django import forms from .models import Nomination, Category class NominationForm(forms.ModelForm): def __init__(self, *args, **kwargs): # 提取传入的当前用户参数,不传递给父类初始化方法 self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 限制category下拉框仅展示当前用户创建的分类 if self.user: self.fields['category'].queryset = Category.objects.filter(createdby=self.user) # 隐藏创建人字段,后续在视图层自动赋值,避免用户手动选择 self.fields['createdby'].widget = forms.HiddenInput() self.fields['createdby'].required = False class Meta: model = Nomination fields = ["fullname", "nominee_id", "category", "image", "slug", "votes", "createdby"]
注:请确保你的
Category模型也存在createdby外键字段存储创建人信息,否则上述过滤逻辑无法生效。
第二步:修改视图层代码
实例化表单时传入当前登录用户,保存数据时自动填充创建人字段:
# views.py from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .forms import NominationForm # 加登录校验装饰器,确保只有登录用户可以访问该视图 @login_required def create_nomination(request): if request.method == "POST": # 提交表单时也要传递当前用户,避免校验失效 form = NominationForm(request.POST, request.FILES, user=request.user) if form.is_valid(): nomination = form.save(commit=False) # 自动赋值创建人为当前登录用户 nomination.createdby = request.user nomination.save() return redirect("nomination_list") # 改成你自己的跳转路由名 else: # GET请求初始化表单时传入当前登录用户 form = NominationForm(user=request.user) return render(request, "create_nomination.html", {"form": form})
内容的提问来源于stack exchange,提问作者spiritman
相关产品推荐
相关产品推荐

