2017-11-29 1 views
0

models.pyDjango fügt kein Attribut der benutzerdefinierten Modelform Widget

class MyModel(models.Model): 
    pub_date = models.DateTimeField(default=timezone.now) 
    title = models.CharField(max_length=255, blank=False, null=False) 
    text = models.TextField(blank=True, null=True) 

forms.py

class MyModelForm(ModelForm): 
    tos = BooleanField() 
    class Meta: 
     model = models.MyModel 
     fields = ['title', 'text', 'tos'] 
     widgets = { 
      'title': TextInput(attrs={'class': 'form-control', 'placeholder': 'Title'}), 
      'text': Textarea(attrs={'class': 'form-control', 'placeholder': 'Text'}), 
      'tos': CheckboxInput(attrs={'data-validation-error-msg': 'You have to agree to our terms and conditions'}), 
     } 

Ergebnisse:

>>> print(forms.MyModelForm()) 
<tr><th><label for="id_title">Title:</label></th><td><input type="text" name="title" class="form-control" placeholder="Title" maxlength="255" required id="id_title" /></td></tr> 
<tr><th><label for="id_text">Text:</label></th><td><textarea name="text" cols="40" rows="10" class="form-control" placeholder="Text" id="id_text"></textarea></td></tr> 
<tr><th><label for="id_tos">Tos:</label></th><td><input type="checkbox" name="tos" required id="id_tos" /></td></tr> 

Sie können sehen, dass in dem TOS-Feld data-validation-error-msg Attribut fehlt.

Irgendwelche Ideen?

EDIT

Dies funktioniert:

Es ist immer noch seltsam, dass es nicht mit der Meta Klasse nicht funktioniert.

Antwort

0

Die Option widgets dient zum Überschreiben der Standardwerte. Es funktioniert nicht für Ihr Feld tos, weil Sie in Ihrem Formular tos = BooleanField() deklariert haben. Weitere Informationen hierzu finden Sie im Hinweis in der widgets docs.

Sie können das Problem beheben, indem widget vorbei, wenn Sie das tos Feld deklarieren:

class MyModelForm(ModelForm): 
    tos = BooleanField(widget=CheckboxInput(attrs={'data-validation-error-msg': 'You have to agree to our terms and conditions'})) 
    class Meta: 
     model = models.MyModel 
     fields = ['title', 'text', 'tos'] 
     widgets = { 
      'title': TextInput(attrs={'class': 'form-control', 'placeholder': 'Title'}), 
      'text': Textarea(attrs={'class': 'form-control', 'placeholder': 'Text'}), 
     } 
Verwandte Themen