Запрет на создание пользователем новых тегов

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:

Вернуться на верх