Choicefield渲染在空字符串或十进制('0')之间没有区别

时间:2009-12-13 10:33:18

标签: django django-models django-forms

我有一个表单,用于呈现一个总共3个选项值的选择域窗口小部件:0,6,19(这些是“十进制”类型)。

当通过值为6或19的模型格式编辑对象时,窗口小部件在渲染时选择了正确的对象,但是当对象以“十进制('0')值存储时,它选择了empty_label(是手动添加的,因为添加新对象时不会从模型中填充列表)

填充器:

taxlevels =  [('', u'---'),]
taxlevels += Metadata.objects.values_list('value', 'display'). \
        filter(attribute__startswith='TAX').order_by('attribute')

我需要将render方法子类化吗?

感谢名单!

编辑:添加了代码段(不想要垃圾邮件;)

表格:

class ProductForm(forms.ModelForm):
    """ Product Model field specifications for new/edit.
    """
    class Meta:
        model = Product

    def clean(self):
        cleaned_data = self.cleaned_data

        if cleaned_data.get('tax_level') == '--':
            msg = _('Choose a VAT percentage.')
            self._errors['tax_level'] = ErrorList([msg])

        return cleaned_data

    description = forms.CharField(
                            label = _('Notes'),
                            help_text = _('Max. 100 characters'),
                            max_length = 100,
                            widget = forms.Textarea(attrs =
                                    {'rows': 2, 'cols': 40, 'maxlength': 100}
                                    ),
                            required = False,
                            )
    # -- snip --
    btwlevels =  [('', u'---'),]
    btwlevels += Metadata.objects.values_list('value', 'display'). \
            filter(attribute__startswith='BTW').order_by('attribute')

    tax_level = forms.ChoiceField(
                            label = _('VAT'),
                            choices = btwlevels,
                            required = True,
                            )

模特:

class Product(models.Model):
    """ Product Model
    """
    objects=UserFilteredManager()

    owner = models.ForeignKey(User, editable=False)

    order = models.ForeignKey(Order, editable=False)
    name = models.CharField(_('Name'), max_length=50)
    description = models.CharField(_('Notes'), max_length=100)
    amount = models.DecimalField(_('Amount'), max_digits=10, decimal_places=2)
    unit_price = models.DecimalField(_('Unit price'), max_digits=10,
                                            decimal_places=2)
    tax_level = models.DecimalField(_('Tax'), max_digits=3, decimal_places=1)

希望这会有所帮助,我会在此期间检查TypedChoiceField。

再次谢谢。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我会先用TypedChoiceField尝试一下自定义的empty_value,它会在代码中手动处理。

但如果您展示了更多代码,那么更详细地回答会很有帮助

答案 1 :(得分:0)

解决了!!

问题是从数据库中获取的值是十进制('0'),而option_value中包含的值是十进制('0.0')。对于计算,这运行没有错误。但是..

Django(版本1.1.1)检查函数render_option(file:forms / widgets.py,line:411),何时渲染'value is selected'

由于“0”不是“0.0”,因此失败,因此在绑定的模型中,将永远不会选择select小部件中的正确值。

我生命中的3个小时窗外:)