首页 > 解决方案 > 在 Django 中实例化时预填充非模型表单属性

问题描述

我想在视图中实例化表单时为表单上的 DecimalField 属性设置最小值。我想从我从数据库中收集的对象中获取最小值。我通过手动将 html 表单放入模板中使其(某种程度)工作,但我想重构它以使用表单类,因为我可以在视图中对数据做比在模板中做更多有用的事情。

根据我对其他问题和文档的阅读,我无法使用.initial参数设置属性。我认为可能我需要覆盖__init__表单上的方法,但我很确定我没有正确执行此操作,并且在语法上没有任何意义。这是我尝试过的:

class BidForm(forms.Form):
    bid = forms.DecimalField(decimal_places=2)
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'].min = min_bid
        self.fields['listing_bid'] = listing_pk

我的想法是让这个表单采用 amin_bid和 a ,并用变量listing_pk中的任何内容填充 html 输入上的“min”属性。min_bid我想将listing_pk传入的值作为一个名为“listing_bid”的隐藏字段中的值。如果它有助于澄清,我正在尝试生成相当于:

<input type="number" name="bid" min="{{ listing.current_bid }}">
<input type="hidden" name="listing_bid" value="{{ listing.pk }}">

在视图中,我想说的是:

form = BidForm(min_bid=foo, listing_bid=bar)

然后将其传递到模板上下文中进行渲染。

这有意义吗?我在 ModelForms 的上下文中找到了一些关于它的讨论,但我无法理解如何使用常规表单来做到这一点。

编辑:供将来参考,这对我有用。我删除了表单上的 bid 属性,因为在不提供以下内容的情况下我不想初始化它min_bid

class BidForm(forms.Form):
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'] = forms.DecimalField(decimal_places=2, min_value=min_bid)
        self.fields['listing_bid'].initial = listing_pk

标签: django

解决方案


您可以使用.initial属性:

class BidForm(forms.Form):
    bid = forms.DecimalField(decimal_places=2)
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'].min_value = min_bid
        self.fields['listing_bid'].intial = listing_pk

推荐阅读