Пожалуйста, как узнать количество объявлений в категории, я пробовал

#python #django

Вопрос:

У меня есть приложение django, и мне нужно подсчитать количество объявлений в категории (как определено в приведенных ниже моделях).:

вот моя полная модель

 class Category(models.Model):
    name = models.CharField(max_length=500)
    icon = models.ImageField(upload_to='photos/icons/%Y/%m/%d/')

    def __str__ (self):
        return self.name
     
class Listing(models.Model):

    name = models.CharField(max_length=300)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default=False, null=True)
    email = models.EmailField(max_length=300)
    description = RichTextField(blank=False, null=False)
    photo_main = models.ImageField(upload_to = 'photos/%Y/%m/%d/')
    photo_1 = models.ImageField(upload_to = 'photos/%Y/%m/%d/', blank=True, default=True)
    photo_2 = models.ImageField(upload_to = 'photos/%Y/%m/%d/', blank=True, default=True)
    photo_3 = models.ImageField(upload_to = 'photos/%Y/%m/%d/', blank=True, default=True)
    photo_4 = models.ImageField(upload_to = 'photos/%Y/%m/%d/', blank=True, default=True)
    location = models.CharField(max_length=500, null=True)
    phone_number =  models.CharField(max_length=11, default = "#")

    website =  models.CharField(max_length=150, blank=True, default="#")
    facebook =  models.CharField(max_length=150, blank=True, default="#")
    instagram =  models.CharField(max_length=150, blank=True, default="#")
    opening_time =  models.CharField(max_length=7)
    closing_time =  models.CharField(max_length=7)
    is_published = models.BooleanField(default=False)
    posted_date = models.DateTimeField(auto_now_add=True)
    user_id = models.IntegerField(blank=True)


    def __str__ (self):
        return self.name
 

вот мои взгляды

 from django.shortcuts import render

from listings.models import Listing
from listings.models import Category
from testimonies.models import Testimony
from our_team.models import Team_Mate
from testimonies.models import Testimony
from django.db.models import Count


def index(request):
 

эта часть работает идеально.

     listings = Listing.objects.order_by('-posted_date').filter(is_published=True)[:6]
    category = request.GET.get('category')
    categories = Category.objects.all()[:7]
 

подсчет объявлений в категории

     count_cate = Category.objects.all()
    cate_count = count_cate.count()




if category == None:
    listings = Listing.objects.order_by('-posted_date').filter(is_published=True)[:6]

else:
    listings = Listing.objects.filter(Category__name=category)
    
 

here is my context

 context ={
    'listings': listings,
    'categories': categories,
    'cate_count': cate_count,
    }

return render(request, 'pages/index.html', context)
 

Вот мой html-код, в котором я хочу, чтобы отображалось количество объявлений в категории

 {% extends 'base.html' %}
{% load static %}

{% block content %}

<!-- ======= Intro Section ======= -->
<div class="header">
<div class="header-content display-table">
<div class="table-cell">
  <div class="container">
    <h1 class="header-title text-light text-uppercase pb-3">Explore Bonny Island</h1>
    <h3 class="text-light">Find. Connect. Share</h3>
    <div class="search mt-3 px-0 py-1 mx-0">
      <form action="{% url 'search' %}" method="GET">
        {% csrf_token %}
        <div class="row d-flex justify-content-center container p-0 m-0 px-1">
          <input type="text" name="keywords"
            class="form-control col-lg-3 col-md-12 col-sm-12 mx-2   py-4 my-2 border border-5"
            placeholder=" Keyword">
          <input type="text" name="location"
            class="form-control col-lg-3 col-md-12 mx-2   py-4 col-sm-12 my-2 border border-5"
            placeholder=" Location">
          <input type="text" name="category" value="{{ query }}" list="category"
            class="form-control col-lg-3 col-md-12 col-sm-12 mx-2  py-4 my-2 border border-5" 
placeholder=" Category (All)">
          <datalist id="category">
            {% for categories in categories %}
            <option>{{ categories.name }}</option>
            {% endfor %}
          </datalist>
          <button type="submit"
            class="btn search-bt col-lg-2 col-md-12 mx-2 col-sm-12 py-2 px-2 font-weight-bold my- 
2">Search</button>
        </div>
      </form>
    </div>
  </div>
</div>
</div>
</div><!-- End Intro Section -->



<!-- ======== most popular categories ========= -->
<section class="main">
<div class="discover pb-1 m-0">
<h2>Explore Categories</h2>
<div class="container">
  <div class="row justify-content-around m-0 p-0 pt-3">
    {% for category in categories %}
    {% if category %}
    <div class="col-lg-3 col-md-6 py-2">
      <a href="{% url 'listings' %}?category={{ category.name }}" class="card category">
        <div class="d-flex justify-content-between align-items-start px-3 m-0 py-2">
          <div class="category-name-icon p-0 m-0">
            <span class="text-dark font-weight-bold"><img class="category-icon" src="{{ 
category.icon.url }}">
              {{category.name}}</span>
          </div>
            <div class="category-list-number text-muted font-weight-bold">{{cate_count}}</div>
        </div>
      </a>
    </div>
    {% endif %}
    {% endfor %}
    <div class="col-lg-3 col-md-6 py-2">
      <a href="{% url 'category' %}" class="card category" data-bs-toggle="collapse" 
        href="#collapseExample"
        role="button" aria-expanded="false" aria-controls="collapseExample">
        <div class="d-flex justify-content-between = px-3 m-0 py-2">
          <i class="font-weight-bold py-1 text-secondary">More Categories...</i>
        </div>
      </a>
    </div>

  </div>
</div>
</section> <!-- ======== most popular categories end ======== -->

<!--       STRUCTURING THE POPULAR LISTINGS CONTENT-->
    <section id="popularListings" class="container mb-5 py-5">
        <!--            Popular listenings head title-->
        <div class="sectionTitle  d-flex justify-content-between align-items-baseline">
            <div class="mainTitleContents">
                <h2 class="titleText h2 text-blue">Popular Listings</h2>
                <p class="subTitleText mb-2">Explore businesses on the island.</p>
            </div>
            <div class="filterOption">
                <a href="{% url 'listings' %}"  class="btn btn-sm bg-blue">All Listings</a>
            </div>
        </div>
        <!--           MAIN POPULAR LISTINGS ROW CONTENT-->
        <div class="popularListingsRows row py-2">
            {% if listings %}
            {% for listing in listings %}
            <div class="customCard p-1 m-0 col-lg-3 col-md-4 col-sm-6 mt-sm-3">
                <div class="card">
                    <div class="card-header p-0">
                        <div class="blank rounded" style="background-image: url('{{ 
                         listing.photo_main.url }}'); background-repeat: no-repeat;
                          background-size:cover; width:100%; height: 15em; background- 
                          position:center-top" ;></div>
                    </div>
                    <div class="card-body">
                        <div class="content-details">
                            <h3 class="m-0 mt-1 mb-2 cardTitle">{{ listing.name }}</h3>
                            <p class="cardSubTitle">
                              {%autoescape off%}
                                {{ listing.description|striptags|truncatechars:100 }}
                              {%endautoescape%}
                            </p>
                            <a href="{% url 'listing' listing.id %}" class="btn btn-sm bg-blue text- 
light rounded-none">Read More</a>
                        </div>
                    </div>

                </div>
            </div>

        {% endfor %}
        {% else %}
      <div class="col-md-12">
        <p class="text-dark">No listings Available</p>
      </div>
      {% endif %}
    </div>

    </section>
{% endblock %}
 

Как я могу заставить этот код работать так, как задумано?

Комментарии:

1. cate_count = Listing.objects.filter(Category__name=category).count() .

2. Я ТОЛЬКО ЧТО ПОПРОБОВАЛ, У МЕНЯ ЕСТЬ ЭТА ОШИБКА thiserrorFieldError в / Не удается разрешить ключевое слово «Категория» в поле. На выбор: категория, идентификатор категории, время закрытия, описание, электронная почта, facebook, идентификатор, instagram, is_published, местоположение, имя, время открытия, номер телефона, фото_1, фото_2, фото_3, фото_4, фото_майн, дата публикации, идентификатор пользователя, веб-сайт

3. это со строчной c буквы , так .filter(category=...) что . То же самое относится и к вашему запросу в else: части.

4. Это будет работать только в том случае, если вы выбрали категорию, так category что это не None так .

Ответ №1:

Вы должны вызвать метод count в списке таких объектов, как…

 if category == None:
    listings = Listing.objects.order_by('-posted_date').filter(is_published=True)[:6]

else:
    listings = Listing.objects.filter(category__name=category).count()
 

Пожалуйста, убедитесь, что там, где вы есть Category__name=category , вы должны разрешить, чтобы это соответствовало вашему полю модели category .

В вашем html :

 <!-- ======= Intro Section ======= -->
<form action="{% url 'search' %}" method="GET">
    {% csrf_token %}  
    <div class="row d-flex justify-content-center container p-0 m-0 px-1">
        ...
        <!--<input type="text" name="category" value="{{ query }}" list="category" class="form-control col-lg-3 col-md-12 col-sm-12 mx-2  py-4 my-2 border border-5" placeholder=" Category (All)">-->

        <!-- Remove value="{{ query }}" -->
        <input type="text" name="category" list="categories" class="form-control col-lg-3 col-md-12 col-sm-12 mx-2  py-4 my-2 border border-5" placeholder=" Category (All)">

        <!-- Should be category in categories instead of categories in categories -->
        <datalist id="categories">
            {% for category in categories %}
                <option value="{{ category.name }}"> <!-- Setting the value here... -->
            {% endfor %}
        </datalist>
        ...
    </div>       
</form>
 

Комментарии:

1. когда я использовал списки = Список.объекты.фильтр(категория__имя=категория).количество() Этого больше не было, но дает 0, а не количество объявлений в этой категории

2. Где ты был category = request.GET.get('category') … Распечатайте category в консоли и скажите мне, что вы видите.

3. результат-Нет

4. Тогда вот в чем проблема, почему вы получаете 0 объявления… Как вы использовали категорию в своем шаблоне? Возможно, вам также следует включить это в свой пост.

5. категория связана с моделью категории

Ответ №2:

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

 cate_count = Listing.objects.filter(category__name="Catering services").count()
 

Комментарии:

1. Проверьте мой ответ, где я обновил <!-- ======= Intro Section ======= --> форму…