Django CharField 限制

1 投票
3 回答
1173 浏览
提问于 2025-04-15 13:14

我想知道怎么给一个字符字段(CharField)设置一个黑名单。不过我希望这个黑名单在Django的管理面板里也能生效……要不然我就只在视图里验证了。

这里说的黑名单是指那些不能使用的值。我已经把这个值设置为唯一(unique),但我还想禁用一些特定的字符串。

谢谢,
Max

3 个回答

0

这件事默认情况下是做不到的。你需要自己写一个自定义表单字段,或者添加一些自定义的管理处理,这样才能在管理后台进行验证。如果想在数据库层面上实现这个功能,我猜可能需要设置一些触发器和存储过程,但这方面我不太了解,所以就不多说了。

4

因为我们已经过了几年,所以你应该写一个自定义的黑名单验证器:

from django.db import models    
from django.core.exceptions import ValidationError

def validate_blacklist(value):
    if value in ['a', 'b', 'c']:
        raise ValidationError(
            "'a', 'b' and 'c' are prohibited!",
            params={'value': value},
        )

class MyModel(models.Model):
    even_field = models.CharField(max_length=200, validators=[validate_even])

可以查看:Django 验证器 获取完整的文档。

2

我会重写模型的save()方法,在调用父类的save()方法之前,先把要插入的值和一个黑名单进行对比。

大概是这样的(简化版):

class BlackListModel(models.Model):   
   blacklist = ['a', 'b', 'c']

   # your model fields definitions...

   def save(self, *args, **kwargs):
        if self.blacklist_field in self.blacklist:
            raise Exception("Attempting to save a blacklisted value!")
        return super(BlackListModel, self).save(*args, **kwargs)

这样的话,在你所有的应用程序中都能正常工作。

撰写回答