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

Django表单外键下拉仅展示当前用户录入数据报错如何解决

问题原因

你遇到的报错核心有3个问题:

  1. 你的Nomination模型没有定义user字段,仅存在存储创建人信息的createdby字段,直接调用self.instance.user必然会触发属性不存在的报错
  2. 表单逻辑和需求不匹配:你需要限制的是Nomination表单中外键category的下拉选项,当前你写的CategoryForm、过滤Award表的逻辑完全和需求错位
  3. 表单本身无法直接获取当前登录的用户信息,需要你从视图层主动把用户对象传递给表单

解决方案

第一步:修改表单类

调整表单逻辑,新增接收用户参数的逻辑,限制分类下拉选项仅展示当前用户创建的内容:

# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:01