У объекта 'list' нет атрибута 'all'

Я создаю приложение для книжного блога и пытаюсь get cleaned_data in creation form и реализую функцию, в которой "User can add multiple books (like tags) in blogpost which are saved in another model" и If any of book name (Book Tag) mentioned in the form not in the Book List чем он покажет ошибку "You cannot create a new book name"

Так я сделал оператор if else для проверки того, есть ли введенное название книги в существующей книге в Book Model BUT Чем он работал отлично BUT Проблема возникла When someone types 3 book names and one of them book name is in saved book name than , it will not see other book names which are not saved (It is saving the post), So it will not show error

Так что я думаю, что я должен получить доступ ко всем упомянутым названиям книг, указанным в форме, методом .all() (Таким образом, он будет проверять, нет ли какого-либо названия книги в существующих названиях), но эта ошибка продолжает появляться.

у объекта 'list' нет атрибута 'all'

Что я пытаюсь сделать :-

Я пытаюсь проверить все mentioned names in form если одного из имен нет в сохраненных именах книг, то появляется ошибка.

models.py

class BlogPost(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, default='')
    body = models.CharField(max_length=30, default='')
    book_names = models.CharField(max_length=30,default='')

class Book(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    existing_book_names = models.CharField(max_length=30,default='')

views.py


def new_blog_post(request):
    ExistingNames = Book.objects.all().values_list('name', flat=True)

    if request.method == 'POST':
        form = BlogForm(request.POST, request.FILES)
        if form.is_valid():
            names = form.cleaned_data['book_names']
            new_post = form.save(commit=False)
            new_post.post_owner = request.user

            for inputTags in names.all():
                if inputTags in ExistingNames:
                    form.save()
                    return redirect('blogs')
                else:
                    messages.error(
                        request, 'You cannot add new name.')

    else:
        form = BlogForm()

    context = {'form': form}
    return render(request, 'new_blog_post.html', context)

Я пробовал много раз, но ничего не вышло.

Я буду очень признателен за вашу помощь. Спасибо

Использование all() это не list.all(), это all(list).

Пример:

list = [False, True, False, False, True]

#right
print(all(list))

#wrong
print(list.all())

Более подробную информацию вы можете найти на GeeksforGeeks.

Надеюсь, это помогло.

У вас обычная ошибка: есть цикл для проверки, все ли удовлетворяет какому-то требованию, но вы действуете немедленно, когда встречаете первый элемент, который удовлетворяет требованию.

Со

for inputTag in names: # removed the all(), inputTag is a single one at a time
  if inputTag in ExistingNames:
    form.save()
    return redirect('blogs')
  else:
    messages.error(
      request, 'You cannot add new name.')

должен действовать после цикла, сохраняя успех/неуспех в переменной:

everythingisfine = True              # the new variable

for inputTag in names:               # removed the all()
  if inputTag not in ExistingNames:
    everythingisfine = False
    break                            # if one failed, no need to check the rest

if everythingisfine:                 # checking the new variable, after the loop
  form.save()
  return redirect('blogs')
else:
  messages.error(
    request, 'You cannot add new name.')

но вы правы в том, что all() это вещь, она может сделать конструкцию намного короче:

everythingisfine = all(inputTag in ExistingNames for inputTag in names)

if everythingisfine:                 # checking the new variable, after the loop
  form.save()
  return redirect('blogs')
else:
  messages.error(
    request, 'You cannot add new name.')
Вернуться на верх