在django forms.py中获取URL pk

问题描述 投票:0回答:1

我有这个网址

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 是什么,以便仅检索属于该“生产者”的“产品”

django forms django-forms
1个回答
1
投票

您需要“修补”表单构造函数,并在

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
将返回
None
,但您应该返回all代码路径的HTTP响应。

© www.soinside.com 2019 - 2024. All rights reserved.