【问题标题】:Filtering ModelForm in django shows empty choice in web form在 django 中过滤 ModelForm 在 Web 表单中显示空选项
【发布时间】:2017-07-27 11:14:27
【问题描述】:

我正在尝试按 Django 的股票组过滤一些选择,但是当我在网络表单中这样做时是空的。

如果我在过滤时直接输入组号,它可以工作。也许我的论点有问题?

在views.py中我有:

class AddSupplier(generic.View):
    form_class = CreateOrder
    template_name = 'order/order_form.html'

    #blank, ce je get metoda
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    def post(self, request):

        group = self.request.user.groups.values_list('id', flat=True).first()
        # I tried:
        # group = self.request.user.groups.all() 
        # same result

        form = self.form_class(group, request.POST)

        if form.is_valid():
            createS = form.save(commit=False)

            supplier = form.cleaned_data['supplier']

            createS.save()

        return render(request, self.template_name, {'form': form})

forms.py

class CreateOrder(forms.ModelForm):
    def __init__(self, group,*args,**kwargs):
        super (CreateOrder, self ).__init__(*args,**kwargs)
        self.fields['supplier'].queryset = Supplier.objects.filter(group_s=group) # if I put group = 1 it works

    class Meta:
        model = Order
        fields = [
            'supplier',
        ]

以及在models.py中的想法是如何联系起来的:

class Supplier(models.Model):
    #...
    group_s = models.ManyToManyField(Group, help_text="kateri dobavitelji imajo katere stranke")
    #...

class Order(models.Model):
    #...
    supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True)
    #...

【问题讨论】:

    标签: python django django-forms modelform


    【解决方案1】:

    当您为get 请求实例化表单时,您当前不包括group。尝试将代码更改为:

    def get(self, request):
        group = self.request.user.groups.values_list('id', flat=True).first()
        form = self.form_class(group, None)
        return render(request, self.template_name, {'form': form})
    

    【讨论】:

    • 请注意,values_list() 不是必需的。如果你使用group = self.request.user.groups..first(),它的工作原理是一样的。
    • 非常感谢。因此,如果我理解正确,我实际上不需要在 get 中传递参数?
    • 不,__init__ 方法是 def __init__(self, group,*args,**kwargs):,因此您需要为 get 和 post 请求提供 group。如果您不通过 group 进行发布请求,您怎么能期望表单验证供应商?
    • 感谢伙伴,我是网络新手,现在我通过了方法。非常感谢您的帮助
    猜你喜欢
    • 2014-02-24
    • 2012-04-29
    • 1970-01-01
    • 2011-05-30
    • 2015-04-14
    • 2020-12-03
    • 2011-03-01
    • 2010-09-22
    相关资源
    最近更新 更多