如何允许表单提交,但阻止使用Django Admin 3.x保存空白字段?

时间:2020-10-24 05:44:10

标签: django django-admin

我正在使用Django Admin,并且具有这样的模型:

class Item(models.Model):

    id = models.CharField(max_length=14, primary_key=True)
    otherId = models.CharField(max_length=2084, blank=True)

我希望ID是必填且唯一的,并且我希望Admin表单上的otherId是可选的,但是如果提供了otherId,则它必须是唯一的。

我遇到的问题是,每当我使用Admin表单创建Item的实例并且不提供otherId时,Django都会尝试将otherId字段另存为空白值,但这意味着我第二次尝试保存具有空白otherId值的实例时,它将违反列的唯一约束并失败。

我需要Django在保存之前检查otherId字段是否为falsey,如果为falsey,请不要将该空值与模型一起保存。这可能吗?

3 个答案:

答案 0 :(得分:1)

您应将unique=True添加到otherId字段。

otherid = models.CharField(max_length=2084, blank=True, null=True, unique=True)

如果otherId为空,则Django忽略唯一性。

答案 1 :(得分:0)

我不能很好地理解这个问题,但是我认为您需要重写django模型的save方法,并提供您上面所述的自定义逻辑。

class Item(models.Model):
    id = models.CharField(max_length=14, primary_key=True)
    otherId = models.CharField(max_length=2084, blank=True)
    def save(self, *args, **kwargs): 
        
        # handle you logic here 
        # check if self.id is empty string and do something about it
        super(Item, self).save(*args, **kwargs)

对于每个模型django也会自动为主键创建一个字段ID,该ID会自动生成并递增。

答案 2 :(得分:0)

要禁用提交空白字段,必须将null和blank属性设置为False。检查代码。 还要注意,id字段是在django中自动添加的,因此您无需提及。

class Item(models.Model):
    otherId = models.CharField(max_length=2084, blank=False, null=False)