тег «сгруппированный» шаблона django не дает мне сгруппированных записей, поскольку я не хочу

#django #django-models #django-views #django-templates

#django #django-модели #django-просмотры #django-templates

Вопрос:

Я работаю над проектом на django, я использую встроенное представление ArchiveListView, и я хочу сортировать записи, которые будут сгруппированы по общему атрибуту.
Итак, у django ORM нет group by запроса, поэтому я попытался сделать это в шаблоне с помощью regroup тега, но я думаю, что это займет много времени, и это не дает мне сгруппированную запись, поскольку я хочу, чтобы это были модели, которые у меня есть :

 class Vehicle(models.Model):
    serie = models.CharField(max_length=18, unique=True, blank=True, null=True)
    matricule = models.CharField(max_length=18, unique=True, blank=True, null=True)
    ww = models.CharField(max_length=18,blank=True, null=True)
    marque_id = models.ForeignKey('Marque', blank=True, null=True, on_delete=models.SET_NULL)
    entry_into_service = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True)
    mouchard = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True)
    extinguisher = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True, help_text="extincteur expiratiOn date")
    city_id = models.ForeignKey('City', blank=True, null=True, on_delete=models.SET_NULL)
    region_id = models.ForeignKey('Region', blank=True, null=True, on_delete=models.SET_NULL)
    driver_id = models.ForeignKey('Driver', blank=True, null=True, on_delete=models.SET_NULL)
    class Meta:
        ordering = ['serie','matricule']

    def __str__(self):
        return (self.matricule)

class GazStation(models.Model):
    name = models.CharField(max_length=128, blank=True)
    city_id = models.ForeignKey('City',  blank=True, null=True, on_delete=models.SET_NULL)
    geo_localization = gis_models.PointField(blank=True, null=True)
    class Meta:
        ordering = ['city_id','name']
    def __str__(self):
        return '%s %s' % (self.name, self.city_id.city)
class Refuel(models.Model):
    vehicle_id = models.ForeignKey('Vehicle', blank=True, null=True, on_delete=models.SET_NULL)
    driver_id = models.ForeignKey('Driver', blank=True, null=True, on_delete=models.SET_NULL, limit_choices_to ={'is_driver':True})
    Controlor_id = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name='controlor_refuel', on_delete=models.SET_NULL, limit_choices_to ={'is_controlor':True})
    gaz_station_id = models.ForeignKey('GazStation', blank=True, null=True, on_delete=models.SET_NULL)
    date_time_creation = models.DateTimeField(auto_now=False, auto_now_add=True)
    date_time_modified = models.DateTimeField(auto_now=True, blank=True)
    odometer_reading = models.PositiveIntegerField(blank=True)
    fuel_quantity = models.DecimalField(max_digits=5, decimal_places=2)
    fuel_unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    class Meta:
        ordering = ['gaz_station_id','-date_time_creation']
    def __str__(self):
        return (self.vehicle_id.serie)
 

и это представление класса, которое я использую:

 
####### refuel view filtred by year  #################
class RefuelsListViewSup(LoginRequiredMixin, YearArchiveView):
    queryset = Refuel.objects.order_by('vehicle_id').all()
    date_field = "date_time_creation"
    make_object_list = True
    allow_future = True
 

и шаблон для отображения этого представления:

 {% extends 'base.html' %}
{% load mathfilters %}
{% block title %}
    <title>Refuels Archive</title>
{% endblock title %}
{% block content %}
          <div class="container">
                  <h1>La liste des gazoile archivé </h1>
              <ul>
                  {% for date in date_list %}
              <li>{{ date|date }}</li>
                  {% endfor %}
              </ul>
          <div>
        <h1>All Refuels for {{ year|date:"Y" }}</h1>
        {% regroup object_list by vehicle_id as vehicle_refuel %}
        <ul>
          {% for vehicle_id in vehicle_refuel %}
            <p>
              <li>Les pleints fait pour {{ vehicle_id.grouper}} sont:</li>
            </p>
            <table border="2">
              <thead class="table-dark">
                <th colspan="2">Driver name :</th>
                <th>Driver number :</th>
                <th>Gaz Station : </th>
                <th>Date :</th>
                <th>Kilometrage :</th>
                <th>Quantity of Fuel: </th>
                <th>Litre Price (Dh): </th>
                <th>Totale (Dh)</th>
                <th>City</th>
              </thead>
              <tbody id="body-table"><tr>
              {% for refuel in vehicle_id.list %}
              <tr>
                <td colspan="2">{{ refuel.driver_id.first_name}}  {{ refuel.driver_id.last_name }}</td>
                <td>{{ refuel.driver_id.registration_number }}</td>
                <td>{{ refuel.gaz_station_id.name}}</td>
                <td>{{ refuel.date_time_creation }}</td>
                <td>{{ refuel.odometer_reading }}</td>
                <td>{{ refuel.fuel_quantity }}</td>
                <td>{{ refuel.fuel_unit_price }}</td>
                <td>{{ refuel.fuel_quantity|mul:refuel.fuel_unit_price }}</td>
                <td>{{ refuel.gaz_station_id.city_id.city }}</td>
              </tr>
              {% endfor %}
            </tbody>
            {% endfor %}
        </ul>

          </div>
        </div>

        {% endblock content %}
 

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

1. Можете ли вы рассказать нам, как выглядит желаемая группировка? может быть, приведите пример, пожалуйста

2. Я хочу сгруппировать refuels запросы по vehicle_id , потому что я хочу отобразить все заправки в течение года в таблице для каждого транспортного средства.

3. Да, я так понимаю. Более конкретно, он вообще ничего не показывает — или он дает вам другую группировку?

4. Это дает мне одну запись в таблице, и для каждого транспортного средства я нахожу, что существует несколько таблиц, чего я не хочу. Мне нужна одна таблица для каждого транспортного средства со всеми записями

Ответ №1:

У вас две ошибки в вашем html

случайный <tr> элемент без закрывающего тега.

 <tbody id="body-table"><tr>
              {% for refuel in vehicle_id.list %}
 

нет закрывающего тега для <table>

           </tr>
          {% endfor %}
        </tbody>
<!-- missing </table> here-->
      {% endfor %}
    </ul>
 

Поскольку я не могу запустить ваш код, я предположил, что <tr> тега там не должно быть.

Поэтому, надеюсь, это решит вашу проблему.

 {% extends 'base.html' %}
{% load mathfilters %}
{% block title %}
<title>Refuels Archive</title>
{% endblock title %}
{% block content %}
<div class="container">
  <h1>La liste des gazoile archivé </h1>
  <ul>
    {% for date in date_list %}
    <li>{{ date|date }}</li>
    {% endfor %}
  </ul>
  <div>
    <h1>All Refuels for {{ year|date:"Y" }}</h1>
    {% regroup object_list by vehicle_id as vehicle_refuel %}
    <ul>
      {% for vehicle_id in vehicle_refuel %}
      <p>
        <li>Les pleints fait pour {{ vehicle_id.grouper}} sont:</li>
      </p>
      <table border="2">
        <thead class="table-dark">
          <th colspan="2">Driver name :</th>
          <th>Driver number :</th>
          <th>Gaz Station : </th>
          <th>Date :</th>
          <th>Kilometrage :</th>
          <th>Quantity of Fuel: </th>
          <th>Litre Price (Dh): </th>
          <th>Totale (Dh)</th>
          <th>City</th>
        </thead>
        <tbody id="body-table">
          {% for refuel in vehicle_id.list %}
          <tr>
            <td colspan="2">{{ refuel.driver_id.first_name}} {{ refuel.driver_id.last_name }}</td>
            <td>{{ refuel.driver_id.registration_number }}</td>
            <td>{{ refuel.gaz_station_id.name}}</td>
            <td>{{ refuel.date_time_creation }}</td>
            <td>{{ refuel.odometer_reading }}</td>
            <td>{{ refuel.fuel_quantity }}</td>
            <td>{{ refuel.fuel_unit_price }}</td>
            <td>{{ refuel.fuel_quantity|mul:refuel.fuel_unit_price }}</td>
            <td>{{ refuel.gaz_station_id.city_id.city }}</td>
          </tr>
          {% endfor %}
        </tbody>
      </table>
      {% endfor %}
    </ul>

  </div>
</div>

{% endblock content %}
 

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

1. Он по-прежнему дает мне те же результаты.