在Django Forms.py中获取URL pk

时间:2018-08-23 09:52:34

标签: django forms

我有这个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”

1 个答案:

答案 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响应。

相关问题