【问题标题】:Render dropdown in django view using values from postgres arrayfield使用 postgres arrayfield 中的值在 django 视图中渲染下拉列表
【发布时间】:2021-05-20 13:56:00
【问题描述】:

这是模型中的一个示例:

class Shipment(models.Model):
    shipment_id = models.BigAutoField(null=False, primary_key=True)
    potential_shipping_dates = ArrayField(models.DateField(), verbose_name='Ship Dates', null=True)

以下是我尝试的形式:

class ShippingForm(forms.Form):
    potential_shipping_dates = forms.ModelChoiceField(queryset=Shipment.objects.all())
    def __init__(self, *args, **kwargs):
        super(ShippingForm, self).__init__(*args, **kwargs)

这是我的表单被添加到上下文的地方:

context['shippingForm'] = ShippingForm(initial=??what_goes_here_maybe??)

我的表单渲染得很好,但我想为每个选项显示一个带有日期的下拉列表。

【问题讨论】:

    标签: python django postgresql django-forms django-postgresql


    【解决方案1】:

    好的,这有点复杂,但我想我理解你想要做什么,以及你哪里出错了。

    所以你有一个 Shipment 模型,每个 Shipment 实例都有一个字段,其中包含几个不同的potential_shipping_dates。

    假设您有 2 批货物:

    IN : ship1 = Shipment.objects.first()
    OUT:
    
    IN : ship1.potential_shipping_dates
    OUT: ['01/01/2021', '02/02/2021']
    
    IN : ship2 = Shipment.objects.last()
    OUT:
    
    IN : ship2.potential_shipping_dates
    OUT: ['03/03/2021', '04/04/2021']
    

    现在,您是否希望下拉列表中包含所有 4 个日期,并且会选择 Shipment?

    或者您想在表格中选择发货后选择日期?

    ^^ 在 cmets 中回答

    好的,您需要将实例传递给表单:

    views.py

    # Inherit from Django's UpdateView to have `instance` passed through to the form
    class ShippingFormView(UpdateView):
        model = Shipment
        form_class = ShippingForm
    
    
    # Or if you don't want to inherit from inherit from UpdateView
    class ShippingFormView(Blah):
        model = Shipment
        form_class = ShippingForm
    
        def get_form_kwargs(self):
            kwargs = super().get_form_kwargs()
            kwargs['instance'] = self.get_object()
            return kwargs
    
    
    # Or if you're using function based views
    def shipping_form_view(request, pk):
        shipment = get_object_or_404(Shipment, pk=pk)
        form = ShippingForm(request, instance=shipment)
        ...
    
    

    forms.py

    class ShippingForm(forms.Form):
        potential_shipping_dates = forms.ChoiceField(choices=[])
    
        def __init__(self, *args, instance, **kwargs):
            super(ShippingForm, self).__init__(*args, **kwargs)
            self.fields['potential_shipping_dates'].choices = ((dt, dt) for dt in instance.potential_shipping_dates)
    

    ModelChoiceFields 用于选择object,而不是一个属性。

    【讨论】:

    • 所以我想从指定的 Shipment 实例中选择一个日期......就像我有一个货物,我希望能够使用多个不同的日期从表单中更改日期实例化 Shipment 实例时添加的
    • 好的答案在上面
    • 好的,这看起来很棒,是的,我怎样才能成功地将实例传递给表单?非常感谢!
    • @GeneralBear 如果表格有效,form.cleaned_data['potential_shipping_dates'] 将为您提供所选日期。您将在视图本身中使用此日期执行剩余的操作。
    • 好的,你去@GeneralBear
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2015-02-04
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多