如何在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
相关产品推荐
相关产品推荐

