2010-07-08 16 views
26

Django respektiert nicht das max_length Attribut des TextField Modellfeldes während der Validierung eines ModelForms.Django TextField max_length Validierung für ModelForm

So definiere ich eine LimitedTextField von der models.TextField geerbt und hinzugefügt Validierung models.CharField ähnliche Bits:

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) 

Aber das hat noch keinen Einfluss auf Modelform Validierung.

Was fehlt mir? Jede Hilfe wird sehr geschätzt.

Danke,

OMAT

Antwort

69

Ab Django 1.2 dies getan werden kann durch Validatoren auf Modellebene, wie hier erklärt: https://docs.djangoproject.com/en/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, das nur auf der Clientseite erzwungen wird. See here

+6

Ab Django 1.7 kann das 'max_length' Attribut in TextField verwendet werden –

10

Sie können eine maximale Länge für eine TextField- Durchsetzung durch die Definition eines CharField mit einem Textarea-Widget wie folgt aus:

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',) 
+1

aber dann sollte ich das für jedes Textfeld wiederholen, das ich begrenzen möchte. Es wäre viel besser, wenn nichts anderes als die Angabe von max_length erforderlich wäre. – omat

+1

Ja, die Angabe von max_length im Modell wäre etwas einfacher, aber die Lösung, die ich anbiete, ist der Standardansatz, den Sie in vielen Django-Apps und sogar innerhalb von django selbst finden (siehe django.contrib.comments). Ich muss das benutzerdefinierte TextField, das Sie beschreiben, noch nicht sehen. Viel Glück. –