Django:固定长度的CharField,怎么样?
我想在我的模型中有一个固定长度的CharField。 换句话说,我希望只有一个指定的长度是有效的。
我试图做类似的事情
volumenumber = models.CharField('Volume Number', max_length=4, min_length=4)
但它给了我一个错误(似乎我可以同时使用max_length和min_length)。
还有另一种快捷方式吗?
谢谢
编辑:
根据一些人的build议,我会更具体些:
我的模型是这样的:
class Volume(models.Model): vid = models.AutoField(primary_key=True) jid = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal") volumenumber = models.CharField('Volume Number') date_publication = models.CharField('Date of Publication', max_length=6, blank=True) class Meta: db_table = u'volume' verbose_name = "Volume" ordering = ['jid', 'volumenumber'] unique_together = ('jid', 'volumenumber') def __unicode__(self): return (str(self.jid) + ' - ' + str(self.volumenumber))
我想要的是volumenumber
必须是正好4个字符。
IE浏览器如果有人插入'4b'django给出一个错误,因为它期望一个4个字符的string。
所以我尝试了
volumenumber = models.CharField('Volume Number', max_length=4, min_length=4)
但它给了我这个错误:
Validating models... Unhandled exception in thread started by <function inner_run at 0x70feb0> Traceback (most recent call last): File "/Library/Python/2.5/site-packages/django/core/management/commands/runserver.py", line 48, in inner_run self.validate(display_num_errors=True) File "/Library/Python/2.5/site-packages/django/core/management/base.py", line 249, in validate num_errors = get_validation_errors(s, app) File "/Library/Python/2.5/site-packages/django/core/management/validation.py", line 28, in get_validation_errors for (app_name, error) in get_app_errors().items(): File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 131, in get_app_errors self._populate() File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 58, in _populate self.load_app(app_name, True) File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 74, in load_app models = import_module('.models', app_name) File "/Library/Python/2.5/site-packages/django/utils/importlib.py", line 35, in import_module __import__(name) File "/Users/Giovanni/src/djangoTestSite/../djangoTestSite/journaldb/models.py", line 120, in <module> class Volume(models.Model): File "/Users/Giovanni/src/djangoTestSite/../djangoTestSite/journaldb/models.py", line 123, in Volume volumenumber = models.CharField('Volume Number', max_length=4, min_length=4) TypeError: __init__() got an unexpected keyword argument 'min_length'
这显然不会出现,如果我只使用“max_length”或“min_length”。
我读了django网站上的文档,似乎我是对的(我不能一起使用),所以我问是否有另一种方法来解决这个问题。
再次感谢
CharField数据库模型字段实例只有一个max_length
参数,如文档中所示 。 这可能是因为在SQL中只有最大字符长度的限制。
另一方面, 表单字段CharField对象确实有一个min_length
参数。 因此,您必须为此特定模型编写自定义的ModelForm,并使用自定义的模型覆盖默认的pipe理模型窗体。
类似的东西:
# admin.py from django import forms ... class VolumeForm(forms.ModelForm): volumenumber = forms.CharField(max_length=4, min_length=4) class Meta: model = Volume class VolumeAdmin(admin.ModelAdmin): form = VolumeForm ... admin.site.register(Volume, VolumeAdmin)
你甚至不必写一个自定义的。 只要使用Django提供的RegexValidator
。
from django.core.validators import RegexValidator class MyModel(models.Model): myfield = models.CharField(validators=[RegexValidator(regex='^.{4}$', message='Length has to be 4', code='nomatch')])
从Django Docs: class RegexValidator(\[regex=None, message=None, code=None\])
regex
:要匹配的有效正则expression式。 有关Python中正则expression式的更多信息,请查看这个优秀的HowTo: http : //docs.python.org/howto/regex.html
message
:如果失败,则返回给用户的消息。
code
:由ValidationError返回的错误代码。 对于您的使用情况不重要,您可以将其忽略。
注意,我build议的正则expression式将允许任何字符,包括空格。 要仅允许字母数字字符,请replace“。” 在正则expression式中使用'\ w'。 对于其他要求,ReadTheDocs;)。
类似上述,但为了什么是值得你也可以继续与Django提供的MinLengthValidator。 为我工作。 代码看起来像这样:
from django.core.validators import MinLengthValidator ... class Volume(models.Model): volumenumber = models.CharField('Volume Number', max_length=4, validators=[MinLengthValidator(4)]) ...
您可以按照@Benbuild议的方式编写自定义validation器。 截至本答案的date,可以在https://docs.djangoproject.com/en/dev/ref/validators/find相关说明。;
代码会是这样的(从链接复制):
from django.core.exceptions import ValidationError def validate_length(value,length=6): if len(str(value))!=length: raise ValidationError(u'%s is not the correct length' % value) from django.db import models class MyModel(models.Model): constraint_length_charField = models.CharField(validators=[validate_validate_length])
- Django的self.client.login(…)在unit testing中不起作用
- Django使用OpenID的最佳解决scheme是什么?
- 在Jinja2中,如何testing一个variables是否是未定义的?
- 错误:预计`2015-05-29T19:06:16.693209Z`为date – Angular
- Django:获取模型字段列表?
- Django:将一整套模型对象转换为单个字典
- 覆盖Django admin中的默认查询集
- Vagrant + Chef:提供错误“虚拟机上缺lessChef所需的共享文件夹”。
- Django的MultiValueDictKeyError错误,我如何处理它