Django:只能填写两个字段中的一个

时间:2010-04-27 18:18:02

标签: django django-models

我有这个型号:

class Journals(models.Model):
    jid = models.AutoField(primary_key=True)
    code = models.CharField("Code", max_length=50)
    name = models.CharField("Name", max_length=2000)
    publisher = models.CharField("Publisher", max_length=2000)
    price_euro = models.CharField("Euro", max_length=2000)
    price_dollars = models.CharField("Dollars", max_length=2000)

有没有办法让人们填写price_europrice_dollars

我知道解决问题的最佳方法是只有一个字段和另一个指定货币的表,但我有约束而我无法修改数据库。

谢谢!

4 个答案:

答案 0 :(得分:4)

界面没有必要反映数据结构。您可以简单地让您的UI显示1个货币字段,然后选择美元和欧元,然后当数据提交回期刊模型时,您只需将其分配到正确的字段并清除另一个。

答案 1 :(得分:3)

JSR223 Test Elements这意味着,除了常规的模型级验证(此方法自从永久生效以来,就一直被用户Tom提出)之外,您现在可以确保无效数据完全无法进入数据库。

# models.py 
from django.db import models
from django.db.models import Q

class Journals(models.Model):
    # [...]

    def clean(self):
        """Ensure that only one of `price_euro` and `price_dollars` can be set."""
        if self.price_euro and self.price_dollars:
            raise ValidationError("Only one price field can be set.")


    class Meta:
        contraints = [
            models.CheckConstraint(
                check=(
                    Q(price_euro__isnull=False) & 
                    Q(price_dollars__isnull=True)
                ) | (
                    Q(price_euro__isnull=True) & 
                    Q(price_dollars__isnull=False)
                ),
                name='only_one_price',
            )
        ]

请确保在Meta.constraints更改后创建并应用迁移。

答案 2 :(得分:2)

我同意T. Stone的观点,customizing the form是最好的选择。如果您不能这样做,或者除此之外,您可以使用custom clean() method on your form强制执行规则。请记住,您在clean()方法中抛出的任何验证错误都不会附加到特定字段,而是附加到表单本身。

答案 3 :(得分:1)

我会在模型clean()方法上做到这一点。这样它也可以与管理站点一起使用。

https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.clean