【问题标题】:django manytomany validationdjango 多线程验证
【发布时间】:2010-10-04 08:29:03
【问题描述】:

请看下面的代码。基本上,当用户创建这个类的对象时,他们需要指定value_type。如果value_type==2(百分比),那么percentage_calculated_on(这是表单/模板端的 CheckboxSelectMultiple 需要检查一个或多个项目。模型验证不允许我像我试图那样进行验证 -它基本上抛出一个异常,告诉我实例需要有一个主键值才能使用多对多关系。但我需要先验证对象,然后再保存它。我已经在表单上尝试过这个验证(modelform) 端(使用表单的 clean 方法),但同样的事情也发生在那里。

如何实现此验证?

INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible'))
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage'))

class Payable(models.Model):
    name = models.CharField()
    short_name = models.CharField()
    inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES)
    value = models.DecimalField(max_digits=12,decimal_places=2)
    value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES)
    percentage_calculated_on = models.ManyToManyField('self', symmetrical=False)

    def clean(self):
        from django.core.exceptions import ValidationError
        if self.value_type == 2 and not self.percentage_calculated_on:
            raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.")

【问题讨论】:

  • 我已将下面 Manoj Govindan 的回答标记为“已接受”,因为它解决了问题。但是,我仍然希望使用 Django 的模型验证对其进行验证。因此,如果有人有任何想法,请努力在此处发布。谢谢。

标签: django validation model-validation


【解决方案1】:

我在我的一个项目的管理应用中测试了您的代码。我能够使用自定义ModelForm 执行您所需的验证。见下文。

# forms.py
class MyPayableForm(forms.ModelForm):
    class Meta:
        model = Payable

    def clean(self):
        super(MyPayableForm, self).clean() # Thanks, @chefsmart
        value_type = self.cleaned_data.get('value_type', None)
        percentage_calculated_on = self.cleaned_data.get(
             'percentage_calculated_on', None)
        if value_type == 2 and not percentage_calculated_on:
            message = "Please specify on what payables/deductibles ..."
            raise forms.ValidationError(message)
        return self.cleaned_data

# admin.py
class PayableAdmin(admin.ModelAdmin):
    form = MyPayableForm

admin.site.register(Payable, PayableAdmin)

管理应用程序使用SelectMultiple 小部件(而不是像您那样使用CheckboxSelectMultiple)来表示多对多关系。我相信这应该无关紧要。

【讨论】:

  • Err... model 真的是admin.ModelAdmin 的属性吗?
  • @Dominic:肯定不是 :P 感谢您指出。我已经修好了。
  • 我在我的 ModelForm 中做类似的事情,除了我先调用 super(MyPayableForm, self).clean() 并且我使用 self.instance.value_type 和 self.instance.percentage_calculated_on 代替。跨度>
  • 我也没有做 raise forms.ValidationError(message),而是使用 self._errors["percentage_calculated_on"] = ErrorList([message]) 将消息“附加”到字段并从清理数据。其他事情不应该重要,所以我倾向于认为我可能会在 self.instance 的使用上犯错?
  • @chefsmart:我不知道如何在模型中做到这一点。除非保存实例,否则 M2M 属性将不起作用,从而使其不可能。也许有办法。我不知道。
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2011-04-15
相关资源
最近更新 更多