我有这个网址
path('private/productores/<pk>', views.Productor_Private.as_view()),
视图.py
class Productor_Private(generic.DetailView):
model = Productor
template_name = 'firstpage/productor_private.html'
def get(self, request, pk):
form = RepartoForm()
return render(request, self.template_name, {'form': form})
def post(self, request, pk):
form = RepartoForm(request.POST)
if form.is_valid():
return render(request, self.template_name, args)
我想从 URL 中检索 pk,将其用作 forms.py 中的过滤器,执行如下操作:
class RepartoForm(forms.Form):
productos = forms.ModelMultipleChoiceField(queryset=Producto.objects.filter(productor=pk))
换句话说,我需要检查当前用户的“生产者”id 是什么,以便仅检索属于该“生产者”的“产品”
您需要“修补”表单构造函数,并在
queryset
函数中手动设置 __init__
:
class RepartoForm(forms.Form):
productos = forms.ModelMultipleChoiceField(queryset=Producto.objects.all())
def __init__(self, *args, productor_pk=None, **kwargs):
super(forms.Form, self).__init__(*args, **kwargs)
if productor_pk is not None:
self.fields['productos'].queryset = Producto.objects.filter(
productor=productor_pk
)
或者对于没有实现更高级参数解包的旧版本Python,可以像这样实现:
class RepartoForm(forms.Form):
productos = forms.ModelMultipleChoiceField(queryset=Producto.objects.all())
def __init__(self, *args, **kwargs):
productor_pk = kwargs.pop('productor_pk', None)
super(forms.Form, self).__init__(*args, **kwargs)
if productor_pk is not None:
self.fields['productos'].queryset = Producto.objects.filter(
productor=productor_pk
)
如果没有给出
product_pk
,查询集是all Producto
(如果您不希望这样,您可以更改表单,例如默认使用 empty QuerySet
,例如Producto.objects.none()
)。
然后在视图中,您可以使用 named
productor_pk
参数构造表单:
class Productor_Private(generic.DetailView):
model = Productor
template_name = 'firstpage/productor_private.html'
def get(self, request, pk):
form = RepartoForm(productor_pk=pk)
return render(request, self.template_name, {'form': form})
def post(self, request, pk):
form = RepartoForm(request.POST, productor_pk=pk)
if form.is_valid():
return render(request, self.template_name, args)
注意:您还需要涵盖表单无效的情况:现在
将返回post
,但您应该返回all代码路径的HTTP响应。None