webentwicklung-frage-antwort-db.com.de

Django TextField-Validierung für max_length für ModelForm

Django beachtet das max_length-Attribut des TextField-Modellfelds nicht, wenn eine ModelForm überprüft wird. 

Also definiere ich ein LimitedTextField, das von den models.TextField geerbt wurde, und fügte Validierungsbits hinzu, die den Modellen ähnlich sind.CharField:

from Django.core import validators

class LimitedTextField(models.TextField):
    def __init__(self, *args, **kwargs):
        super(LimitedTextField, self).__init__(*args, **kwargs)
        self.max_length = kwargs.get('max_length')
        if self.max_length:
            self.validators.append(validators.MaxLengthValidator(self.max_length))

    def formfield(self, **kwargs):
        defaults = {'max_length': self.max_length}
        defaults.update(kwargs)
        return super(LimitedTextField, self).formfield(**defaults)

Dies hat jedoch noch keinen Einfluss auf die Validierung von ModelForm. 

Was vermisse ich? Jede Hilfe wird sehr geschätzt.

Vielen Dank,

oMat

27
omat

Ab Django 1.2 können Validatoren dies auf Modellebene tun, wie hier erläutert: https://docs.djangoproject.com/de/stable/ref/validators/

from Django.core.validators import MaxLengthValidator

class Comment(models.Model):
    comment = models.TextField(validators=[MaxLengthValidator(200)])

Seit Django 1.7 können Sie max_length verwenden, der nur auf Clientseite erzwungen wird. Siehe hier

71
omat

Sie können eine maximale Länge für ein TextField erzwingen, indem Sie ein CharField mit einem Textarea-Widget wie folgt definieren:

class MyClass(models.Model):
    textfield = models.TextField()

class MyForm(forms.ModelForm):
    textfield = forms.CharField(
        max_length = 50,
        widget = forms.Textarea
    )

    class Meta:
        model = MyClass
        fields = ('textfield',)
10

Es ist nicht erforderlich, MaxLengthValidator aus Validatoren für Django 2.x zu importieren

from Django.db import models
class Comment(models.Model):
  comment = models.TextField(max_length=200)
0
Wariored