Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Choicefield render在空字符串和十进制(';0';)之间没有区别_Django_Django Models_Django Forms - Fatal编程技术网

Django Choicefield render在空字符串和十进制(';0';)之间没有区别

Django Choicefield render在空字符串和十进制(';0';)之间没有区别,django,django-models,django-forms,Django,Django Models,Django Forms,我有一个表单,它呈现一个choicefield小部件,总共有3个选择值:0、6、19(它们是“Decimal”类型) 当通过值为6或19的modelform编辑对象时,小部件在渲染时选择了正确的对象,但当对象以值“Decimal('0')存储时,它选择了空的_标签(该标签是手动添加的,因为在添加新对象时列表不是从模型填充的) 填充器: taxlevels = [('', u'---'),] taxlevels += Metadata.objects.values_list('value', '

我有一个表单,它呈现一个choicefield小部件,总共有3个选择值:0、6、19(它们是“Decimal”类型)

当通过值为6或19的modelform编辑对象时,小部件在渲染时选择了正确的对象,但当对象以值“Decimal('0')存储时,它选择了空的_标签(该标签是手动添加的,因为在添加新对象时列表不是从模型填充的)

填充器:

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


再次使用Thanx。

如果我正确理解了您的问题,我将首先使用TypedChoiceField和自定义的空\u值进行尝试,该值将在代码中手动处理

但是,如果您的代码显示得更多,将有助于更详细地回答问题。

解决了它

问题是从数据库中获取的值是十进制的(“0”),而选项_value中包含的值是十进制的(“0.0”)。对于计算,此操作运行时不会出错。但是

Django(版本1.1.1)在呈现“值被选中”时,执行一个检入函数render_选项(文件:forms/widgets.py,第411行)

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

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