Development Tip

Django : 길이가 고정 된 CharField, 어떻게?

yourdevel 2020. 12. 9. 21:54
반응형

Django : 길이가 고정 된 CharField, 어떻게?


내 모델에 고정 길이의 CharField를 갖고 싶었습니다. 즉, 지정된 길이 만 유효하기를 원합니다.

나는 다음과 같은 것을 시도했다.

volumenumber = models.CharField('Volume Number', max_length=4, min_length=4)

그러나 그것은 나에게 오류를 준다 (동시에 max_length와 min_length를 모두 사용할 수있는 것 같습니다).

다른 빠른 방법이 있습니까?

감사

편집하다:

일부 사람들의 제안에 따라 좀 더 구체적으로 설명하겠습니다.

내 모델은 다음과 같습니다.

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 자 문자열을 예상하기 때문에 오류가 발생합니다.

그래서 나는

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"OR "min_length"만 사용하면 분명히 나타나지 않습니다.

나는 django 웹 사이트의 문서를 읽었고 내가 옳은 것 같아 (둘 다 사용할 수는 없습니다) 그래서 문제를 해결할 다른 방법이 있는지 묻습니다.

다시 한 번 감사합니다


CharField 데이터베이스 모델 필드 인스턴스 max_length에는 문서에 표시된대로 매개 변수 만 있습니다 . 이는 아마도 SQL에 상응하는 최대 문자 길이 제한이 있기 때문일 것입니다.

반면에 Form Field CharField 개체에는 min_length매개 변수가 있습니다. 따라서이 특정 모델에 대한 사용자 지정 ModelForm을 작성하고 기본 관리 모델 양식을 사용자 지정 모델로 재정의해야합니다.

그런 것 :

# 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)

사용자 정의를 작성할 필요도 없습니다. RegexValidatorDjango가 제공 하는 것을 사용하십시오 .

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 문서에서 : class RegexValidator(\[regex=None, message=None, code=None\])

regex: A valid regular expression to match. For more on regex in Python check this excellent HowTo: http://docs.python.org/howto/regex.html

message: The message returned to the user in case of failure.

code: error code returned by ValidationError. Not important for your usage case, you can leave it out.

Watch out, the regex suggested by me will allow any characters including whitespace. To allow only alphanumeric characters, substitute the '.' with '\w' in the regex argument. For other requirements, ReadTheDocs ;).


Kind of along the same lines as above, but for what it's worth you could also go ahead with MinLengthValidator which django supplies. Worked for me. The code would look something like this:

from django.core.validators import MinLengthValidator
...
class Volume(models.Model):
volumenumber = models.CharField('Volume Number', max_length=4, validators=[MinLengthValidator(4)])
...

You can write a custom Validator as suggested by @Ben. As of the date of this answer the instructions for doing this can be found at https://docs.djangoproject.com/en/dev/ref/validators/

The code would be something like this (copying from the link):

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_length])

참고URL : https://stackoverflow.com/questions/2470760/django-charfield-with-fixed-length-how

반응형