如何在 Django 表单中编辑选择选项值?

Posted

技术标签:

【中文标题】如何在 Django 表单中编辑选择选项值?【英文标题】:How to edit select option values in Django forms? 【发布时间】:2016-02-18 01:12:51 【问题描述】:

我想在我的 django 表单中编辑选择选项值。 现在 select 中 option 的值是相关的 variant_id。

models.py

class ReceiptDetail(models.Model):
    variant = models.ForeignKey('ProductVariant')

forms.py

class ReceiptDetailForm(forms.ModelForm)    
    class Meta:
        model = ReceiptDetail
        fields = ['product_id', 'variant', 'size', 'quantity', 'price']

在“变体”上选择生成的 html

<option value="" selected="selected">---------</option>
<option value="98">Charm I (Charm I)</option>
<option value="97">Small potion V (Small potion V)</option>
<option value="90">Big potion V (Big potion V)</option>
<option value="100">Charm III (Charm III)</option>
<option value="93">Small potion I (Small potion I)</option>
<option value="94">Small potion II (Small potion II)</option>
<option value="81">Colorfully (Colorfully)</option>

请注意,每个选项的值都是 VARIANT id。我想将该值更改为 PRODUCT id(与变体相关)。

我猜小部件是答案,但我不知道如何访问选择对象内的选项属性。这是我尝试过的:

widgets.py:

class VariantIDWidget(forms.widgets.Select):

    def __init__(self, *args, **kwargs):
        super(VariantIDWidget, self).__init__(*args, **kwargs)

    def render(self, name, value, attrs=None):
        out = super(VariantIDWidget, self).render(name, value,
            attrs='value': 'test')
        return out

这将改变 的值,而不是其相关的 。

【问题讨论】:

【参考方案1】:

我认为你应该在你的表单中定义的fields中排除variant,并在__init__方法中做一些事情:

class ReceiptDetailForm(forms.ModelForm)    
    class Meta:
        model = ReceiptDetail
        fields = ['product_id', 'size', 'quantity', 'price']

    def __init__(self, *args, **kwargs):
        super(ReceiptDetailForm, self).__init__(*args, **kwargs)
        # this is pseudo code but you should get all variants
        # then get the product related to each variant
        variants = Variant.objects.all()
        products = [(i.product.id, i.product.name) for i in variants]
        self.fields['product'] = forms.ChoiceField(choices=products)

这是一种常用技术,请参阅其他一些 SO questions。

【讨论】:

你也可以这样做:self.fields['product'].choices = products

以上是关于如何在 Django 表单中编辑选择选项值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 表单中,如何呈现单选按钮以便在页面上分隔选项?

在django中将注册表单填写到数据库后如何存储用户选择的单选按钮值?

如何在奏鸣曲编辑表单中显示字段值?

Django 表单中的可编辑选择字段/下拉框

如何在 django 中显示编辑后的头像

选择了 django 返回表单选项