Примечание. Чтобы сохранить профессионализм Stack Overflow, я использовал звездочки, чтобы скрыть некоторые матерные слова. Для обычного текста (но не кода) Stack Overflow использует звездочки для обозначения текста, который нуждается в полужирном или итальянском c форматировании, поэтому мое использование звездочек во всем сообщении несовместимо.
формы. py
from blog.models import Comment
from django import forms
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('email', 'body')
def clean_body(self):
body = self.cleaned_data.get("body")
if "f**k" in body or "s**t" in body :
raise forms.ValidationError("No swearing.")
return body
def clean_email(self):
email = self.cleaned_data.get("email")
if not "gmail.com" in email:
raise forms.ValidationError("Email has to be gmail.com")
return email
models.py
class Comment(models.Model):
#The foriegn key is linked to the ID field in the Post model
#id = models.IntegerField(primary_key=True, blank=False)
post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
nameid = models.ForeignKey(User,on_delete=models.CASCADE,related_name='commentsid')
name = models.CharField(max_length=80)
email = models.EmailField()
body = models.TextField()
created_on= models.DateTimeField(default = timezone.now())
active = models.BooleanField(default=True)
views.py
def post_detail(request, pk_slug):
template_name = 'post_detail.html'
if pk_slug.isdigit():
post = Post.objects.filter(id=pk_slug).first()
else:
post = Post.objects.filter(url=pk_slug).first()
comments = Comment.objects.filter(post=post.id ,active=True)
new_comment = None
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
# Post instance which will be assigned to post attribute in Comment model
new_comment = comment_form.save(commit=False)
new_comment.post = get_object_or_404(Post, id=post.id)
new_comment.name = request.user.username
new_comment.nameid = request.user
new_comment.save()
comment_form=CommentForm()
else:
comment_form = CommentForm()
return render(request, template_name, {'post': post,
'comments': comments,
'new_comment': new_comment,
'comment_form': comment_form})
Обновление
Чепнер правильно указал на изъян в моем первоначальном подходе, согласно которому совершенно законные слова, такие как Сканторп (место в Англии), не будут приняты, потому что они содержат оскорбительные подстроки. В случае Сканторпса посмотрите со 2-й по 5-ю буквы. Вы можете узнать больше об этой проблеме здесь https://en.wikipedia.org/wiki/Scunthorpe_problem.
Эту проблему можно в определенной степени избежать с помощью более сложных операторов if.
def clean_body(self):
body = self.cleaned_data.get("body")
if not "Scunthorpe" in body:
if "c**t" in body:
raise forms.ValidationError("No swearing.")
return body
Другая проблема при таком подходе не учитываются темы, поднятые в исходном сообщении. Если исходный пост был о туалетах, то читатели вашего сайта могут законно использовать слово * хит в разделе комментариев. И если вы собираетесь ввести общий запрет на слово * hit, вам также придется отфильтровать преднамеренные орфографические ошибки, такие как s * 1t (заменяя i на 1).
Потенциальный компромисс заключается в том, чтобы любой комментарий, который потенциально содержит оскорбительные выражения, был вручную прочитан суперпользователем перед публикацией комментария на сайте.
def post_detail(request, pk_slug):
template_name = 'post_detail.html'
if pk_slug.isdigit():
post = Post.objects.filter(id=pk_slug).first()
else:
post = Post.objects.filter(url=pk_slug).first()
comments = Comment.objects.filter(post=post.id ,active=True)
#post = Post.objects.get(pk=pk)
new_comment = None
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
#print(comment_form.cleaned_data)
# Post instance which will be assigned to post attribute in Comment model
#post_instance = get_object_or_404(Post, id=post.id)
new_comment = comment_form.save(commit=False)
new_comment.post = get_object_or_404(Post, id=post.id)
if "f**k" in new_comment.body or "s**t" in new_comment.body or "s*1t" in new_comment.body :
new_comment.active = False
new_comment.name = request.user.username
new_comment.nameid = request.user
new_comment.save()
print(comment_form)
comment_form=CommentForm()
else: