我有这个URL
path('private/productores/<pk>', views.Productor_Private.as_view()),
Views.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))
换句话说,我需要检查当前用户的“ productor” ID是什么,以便仅检索属于该“ productor”的“ productos”
答案 0 :(得分:0)
您将需要“修补”表单构造函数,并在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
,则查询集是Producto
的 all (如果您不希望这样做,则可以更改表格,例如默认情况下,使用QuerySet
之类的空 Producto.objects.none()
。
然后在视图中,可以使用名为 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
为此将返回None
,但是您应该为所有代码路径返回HTTP响应。