Site/blog/forms.py

41 lines
2.0 KiB
Python

from django import forms
from .models import Comment
from django.core.exceptions import ValidationError
from django.utils.html import strip_tags
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author_name', 'author_email', 'content']
widgets = {
'author_name': forms.TextInput(attrs={'class': 'form-input', 'placeholder': 'Ваше имя'}),
'author_email': forms.EmailInput(attrs={'class': 'form-input', 'placeholder': 'Ваш email'}),
'content': forms.Textarea(attrs={'class': 'form-textarea', 'rows': 4, 'placeholder': 'Текст комментария',
'autocomplete': 'off'}),
}
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super().__init__(*args, **kwargs)
if self.request and self.request.user.is_authenticated:
# Скрываем поля имени и email
self.fields['author_name'].widget = forms.HiddenInput()
self.fields['author_email'].widget = forms.HiddenInput()
# Заполняем начальные значения из профиля
self.initial['author_name'] = self.request.user.get_full_name() or self.request.user.username
self.initial['author_email'] = self.request.user.email
def clean_content(self):
content = self.cleaned_data['content']
# Удаляем HTML-теги и проверяем, остался ли текст
clean_text = strip_tags(content)
if not clean_text.strip():
raise ValidationError("Комментарий не должен состоять только из HTML-тегов")
# Если хотите запретить любые теги, можно сравнить content и clean_text
if content != clean_text:
raise ValidationError("HTML-теги в комментариях запрещены")
return content