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

如何在Django中将view.py的user.jg传递给forms.py的查询过滤器?

解决方案

核心思路是在表单的初始化方法中接收用户年级参数,再动态过滤难度选项的查询集,具体步骤如下:

1. 修改表单类(forms.py)

重写表单的__init__方法,接收并使用jg参数来过滤选项:

from django import forms
from .models import Schwierigkeit  # 替换为你的难度模型类

class AuswahlForm(forms.Form):
    # 先初始化空查询集,后续在__init__中动态赋值
    schwierigkeit = forms.ModelChoiceField(queryset=Schwierigkeit.objects.none())

    def __init__(self, *args, **kwargs):
        # 取出传递的jg参数(需在调用父类初始化前执行)
        user_jg = kwargs.pop('jg')
        super().__init__(*args, **kwargs)
        # 根据用户年级过滤难度选项
        self.fields['schwierigkeit'].queryset = Schwierigkeit.objects.filter(bis_jg__gte=user_jg)

2. 在视图中传递参数(views.py)

实例化表单时,将当前用户的jg参数传入:

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

def arithmetik_uebung(request):
    # 确保用户已登录(按需添加)
    if not request.user.is_authenticated:
        return redirect('login')
    
    user = request.user
    if request.method == 'POST':
        form = AuswahlForm(request.POST, jg=user.jg)
        if form.is_valid():
            # 处理表单提交后的逻辑,比如生成练习题目
            pass
    else:
        form = AuswahlForm(jg=user.jg)
    
    return render(request, 'uebung_template.html', {'form': form})

错误原因说明

你之前直接在表单字段的queryset中使用jg会报错,是因为表单类定义是静态的,此时jg参数还未被传递。只有在表单实例化时执行的__init__方法中,才能拿到外部传入的jg值并动态修改查询集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:42