Ошибка атрибута: объект 'QuerySet' не имеет атрибута 'name'
В моем Django проекте у меня есть список товаров, в котором пользователи указывают категории при отправке формы "Crate New Item". Маршрут по умолчанию показывает этот список товаров с названием, описанием и категорией товара. Пользователи могут нажать на каждую категорию, чтобы быть перенаправленными на страницу соответствующей категории, где я пытаюсь отобразить все товары, относящиеся к этой категории.
Для этого я хочу проверить, есть ли категория, представленная в форме, в нашей базе данных категорий. Если да, то товар должен быть добавлен на страницу существующей категории, а если нет, то должна быть создана новая категория.
Однако я получаю ошибку атрибута при попытке проверить это в отправке формы, и я застрял. Буду признателен за любую помощь.
AttributeError at /create
'QuerySet' object has no attribute 'name'
error line : if category == all_categories.name:
models.py:
class User(AbstractUser):
pass
class Category(models.Model):
name = models.CharField(max_length = 64, null = True)
class AuctionItem(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE, related_name = "created_by")
title = models.CharField(max_length = 64)
description = models.TextField()
price = models.DecimalField(max_digits = 100 ,decimal_places = 2)
image = models.URLField(blank = True)
category = models.ForeignKey(Category, on_delete = models.CASCADE, related_name = "item_category")
date = models.DateTimeField(auto_now_add = True)
urls.py:
urlpatterns = [
path("", views.index, name="index"),
path("login", views.login_view, name="login"),
path("logout", views.logout_view, name="logout"),
path("register", views.register, name="register"),
path("create", views.create_listing, name="create"),
path("listing/<int:listing_id>", views.listing, name = "listing"),
path("<str:user>/watchlist", views.watchlist, name= "watchlist"),
path("closed", views.closed, name = "closed"),
path("category/<int:category_id>", views.category, name = "category")
]
views.py:
@login_required
def create_listing(request):
if request.method == "POST": #if the create listing form is submitted
title = request.POST["title"] #get the provided title
description = request.POST["description"] #get the provided description
price = request.POST["price"] #get the provided price
image = request.POST["image"] #get the provided image
category = request.POST["category"] #get the provided category
all_categories = Category.objects.filter(name = category)
if category == all_categories.name:
item = AuctionItem.objects.create( #create new auction item with given properties
user = request.user,
title = title,
description = description,
price = price,
image = image,
category = category
)
else:
new_category = Category.objects.create(name = category)
item = AuctionItem.objects.create( #create new auction item with given properties
user = request.user,
title = title,
description = description,
price = price,
image = image,
category = new_category
)
return HttpResponseRedirect(reverse("index")) #after submitting the form, redirect user to the main page
return render(request, "auctions/create_listing.html")
def category(request, category_id):
category = Category.objects.get(id=category_id)
items = AuctionItem.objects.filter(category=category)
return render(request, "auctions/category.html", {
"items" : items,
"name" : category.name
})
category.html:
{% extends "auctions/layout.html" %}
{% block body %}
<h2>Category: {{name}}</h2>
{% for item in items %}
<div class = "frame">
{% if item.image %}
<img src="{{item.image}}" style= "width: 15vw;">
{% endif %}
{% if user.is_authenticated %}
<h4><a href="{% url 'listing' item.id %}">{{item.title}}</a></h4>
{% else %}
<h4>{{item.title}}</h4>
{% endif %}
<br>
<div id="text"><strong>Starting Price:</strong> ${{item.price}}</div>
<div id="text"><strong>Description:</strong> {{item.description}}</div>
{% if item.category %}
<div id="text"><strong>Category: </strong><a href="{% url 'category' item.category.id %}">{{ item.category.name }}</a></div>
{% endif %}
<br>
<div id="created">Created by {{item.user}}, on {{item.date}}</div>
</div>
{% endfor %}
{% endblock %}
Я думаю, что проблема в этом:
all_categories = Category.objects.filter(name = category)
filter() Возвращает новый QuerySet, содержащий объекты, которые соответствуют заданным параметрам поиска.
Я думаю, что вам нужно использовать это, потому что в вашей таблице нет таких данных.
all_categories = Category.objects.get(name = category)
В вашем views.py
файле, Вы хотите сделать атрибут сравнения name
в списке.
all_categories = Category.objects.filter(name = category)
if category == all_categories.name:
all_categories
- это список объектов категории.
all_categories = [ object, object, object]
А когда вы хотите сравнить вот так:
if category == all_categories.name:
Атрибут name
больше не существует для all_categories = [ object, object, object]
.
вы должны проверить свою категорию следующим образом:
if Category.objects.filter(name=category).exists():
... use the exist category to relate you AuctionItem ...
else:
... create new category for relate your AuctionItem ...