41 lines
2.0 KiB
Python
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
|