Получение объекта 'QuerySet' без атрибута 'append' при создании функции, автоматически добавляющей определенное значение из поля ManyToManyField в Django
Я создаю словарь, и одной из функций является обнаружение любых входных данных, которые похожи в модели Censorships. Это делается для того, чтобы дать метку для вульгарных слов.
Это моя модель Word, тег также находится в том же файле, model.py. `class Word(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE)
# Attributes of the model
word = models.CharField(max_length=120)
# Tags for searching and label
tags = models.ManyToManyField('Tag', blank=True, related_name="word_tag")
class Tag(models.Model): name = models.CharField(max_length=50)`
Мой файл forms.py выглядит следующим образом, он содержит формы для модели слов и тегов. `class RawWordForm(forms.Form): word = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "Введите слово"}))
tags = forms.ModelMultipleChoiceField(
queryset=Tag.objects.all(),
widget=forms.CheckboxSelectMultiple
)
user = forms.ModelChoiceField(queryset=User.objects.all(), widget=forms.HiddenInput)
class RawTagForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "Введите тег"}))`
Теперь цензура происходит в views.py, где будет вводиться слово. Я сделал так, чтобы сначала сохранялось слово, а затем устанавливались теги, потому что ModelMultipleChoiceField не позволяет получать теги через clean_data. из .forms import RawWordForm, RawTagForm from .models import Word, Tag from database.models import Censorship
def word_create(request): form = RawWordForm()
if request.method == "POST":
form_data = {
'word': request.POST.get('word'),
'tags': request.POST.getlist('tags'),
'user': request.user,
}
form = RawWordForm(form_data)
if form.is_valid():
# Word save
w = Word(
word = form.cleaned_data['word'],
user = form.cleaned_data['user'],
)
w.save()
tags = form.cleaned_data['tags'],
w.tags.set(request.POST.getlist('tags'))
wrd = w.cleaned_data['word']
censored_words = Censorship.objects.values_list('name', flat=True)
# Word censorship checks
for cword in censored_words:
if censor_word(wrd, cword):
tag_selected = Tag.objects.get(name='Vulgar')
form.cleaned_data['tags'].append(tag_selected)
break
return redirect('home')
else:
print(form.cleaned_data)
print(form.errors)
context = {
'form': form,
}
return render(request, "word/word_form.html", context)`
Я пробовал использовать append, чтобы убедиться, что тег vulgar к новым входам, которые считаются вульгарным словом, должен быть выбран. Но все, что я получаю, это ошибку, которая гласит "'QuerySet' object has no attribute 'append'"
TL;DR если слово находится в цензуре, то оно автоматически выберет тег vulgar вместе с тем, что выбрал пользователь.