I have an issue getting a form to validate correctly when integrating CKEditor and Django Forms.
All other form fields validate correctly except for the CKEditor form which for some reason is allowed submit ‘blank’ when the setting in Models.py is null=False. The server side validation appears to partially work though, as the form is not saved to the database, in accordance with the if form.is_valid(): statement in Views.py.
models.py
class Newsletter(models.Model):
issue_number = models.IntegerField(null=True)
title = models.CharField(max_length=200, default="Dynamic Digest")
summary = models.TextField(null=False, blank=False)
title_1 = models.CharField(max_length=30, null=False, blank=False)
image_1 = models.URLField(null=False, blank=False)
body_1 = models.TextField(null=False, blank=False)
views.py
def write_newsletter(request):
if request.method == 'POST':
form = NewsletterForm(request.POST)
if form.is_valid():
form.save()
return redirect(list_newsletters())
form = NewsletterForm()
return render(request, 'newsletter/edit-newsletter.html', {'form': form})
forms.py
from ckeditor.widgets import CKEditorWidget
class NewsletterForm(ModelForm):
body_1 = forms.CharField(widget=CKEditorWidget(), required=True)
class Meta:
model = Newsletter
fields = ['title',
'summary',
'title_1',
'image_1',
'body_1'
]
labels = {
'title_1': _('Title'),
'image_1': _('Image'),
'body_1': _('Body')
}
widgets = {
"title": forms.TextInput(attrs={'class':
'form-control form-title text-center',
'placeholder': 'Newsletter Header Title'}),
"summary": forms.Textarea(attrs={'placeholder': 'Newsletter Header Summary'}),
"title_1": forms.TextInput(attrs={'class':
'form-control form-title text-center', 'placeholder': 'Title'}),
"image_1": forms.URLInput(attrs={'placeholder': 'Image url https://'}),
}
HTML
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
Copy of relevant part of request.POST (from views.py print(request.POST))
As you can see a “This field is required.” error is present, but for some reason this is not displayed AND submit is allowed.
<tr>
<th><label for="id_image_1">Image:</label></th>
<td><input type="url" name="image_1" value="http://localhost:8000/newsletter/write-newsletter/"
placeholder="Image url https://" maxlength="200" required id="id_image_1"></td>
</tr>
<tr>
<th><label for="id_body_1">Body 1:</label></th>
<td>
<ul class="errorlist">
<li>This field is required.</li>
</ul>
<div class="django-ckeditor-widget" data-field-id="id_body_1" style="display: inline-block;">
<textarea cols="40" id="id_body_1" name="body_1" rows="10" required data-processed="0"
data-config="{"skin": etc. etc. }"
data-external-plugin-resources="[]" data-id="id_body_1" data-type="ckeditortype"></textarea>
</div>
</td>
</tr>