Запрет на создание пользователем новых тегов
I am building a BlogApp and I am trying to implement a feature so user cannot create new tags And can only use existing tags
, So I am checking the form at the time of submit If blog post tags is in existing tags than Save the Post But if tags are not in existing tags than show an Error.
Например:-
Existing tags are health
, books
and if user typed one of them then post will save And If user typed playing
, health
than it will show an error.
Но когда я сохраняю форму с существующими тегами, она выдает ошибку каждый раз
.
models.py
from taggit.managers import TaggableManager
class BlogPost(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=30, default='')
description = models.CharField(max_length=30, default='')
tags = TaggableManager()
views.py
from taggit.models import Tag
def new_blog_post(request):
existingTags = Tag.objects.all()
if request.method == 'POST':
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
blog_tags = form.cleaned_data['tags']
new_post = form.save(commit=False)
new_post.post_owner = request.user
if blog_tags in existingTags:
new_post.save()
else:
messages.error(request,'You cannot create a New Tags')
return redirect('qa:questions')
else:
form = BlogPostForm()
context = {'form': form}
return render(request, 'new_blog_post.html', context)
Я также попробовал зациклить запрос tags
следующим образом :-
for extTags in existingTags:
if blog_tags in extTags:
new_post.save()
Но он продолжает отображаться
Tag object is not iterable
Note : I am using Django-Taggit package for Tagging Functionality
Любая помощь будет очень признательна. Заранее благодарю.
Насколько я понимаю, blog_tags
будет списком или строковым элементом.
Вы пытаетесь сравнить его с набором результатов.
Попробуйте преобразовать набор результатов в список с помощью .values_list('name', flat=True)
и проверить его на существование в нем.
Вы получите хорошую идею, если выведете existingTags и blog_tags.
Ваш вопрос только в том, как обрабатывать теги queryset :
Tag.objects.all()
Эта инструкция возвращает что-то вроде этого :
<QuerySet [<Tag: music>, <Tag: science>]>
И из моего небольшого опыта, иногда трудно играть с такой структурой.
Попробуйте затем existingTags = list(Tag.objects.names())
получить результат, подобный этому: ['music', 'science']
(я использовал names атрибут объекта Tag, slug атрибут тоже существует для удобства).
После этого вы можете проверить if blog_tags in existingTags: