У объекта '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.')