Как отфильтровать данные, отображаемые в таблице в Django? - PullRequest
0 голосов
/ 27 июня 2019

The table should get filtered when I click Filter Results button У меня есть проект, в котором, когда пользователь вводит номер транспортного средства, база данных фильтруется, и отображается таблица, содержащая этот номер транспортного средства и информацию, соответствующую.Кроме того, я хочу отфильтровать эту отображаемую таблицу, например: если пользователь выбирает просмотр количества, превышающего 18 кл, то отображается соответствующий номер транспортного средства с количеством, превышающим 18.Также я хочу скрыть выбранные пользователями столбцы, так как столбцов много.Может кто-нибудь сказать мне, как сделать это в Django, или предложить несколько лучших способов.(Я предоставляю только соответствующий фрагмент кода.)

forms.py

class VehicleSearch(forms.Form):
    vehicl[![enter image description here][1]][1]e_no = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}), required=False)

#filter form
class Filter(forms.Form):
    capacity_grp = forms.ChoiceField(label='Show only', widget=forms.RadioSelect,
                                     choices=[('abv', '>18 kl'), ('blw', '<18 kl')], required=False)

views.py

def search(request):
    form_1 = forms.VehicleSearch()
    if request.method == 'POST' and 'btnform1' in request.POST:
        form_1 = forms.VehicleSearch(request.POST)
        if form_1.is_valid():
            vehicle_no = form_1.cleaned_data['vehicle_no']
            transport = models.Transport.objects.filter(vehicle=vehicle_no)
            my_dict.update({'transport': transport})
    return render(request, 'search.html', my_dict)

search.html

/ Форма автомобиля /

        <form id="f1" method="POST">
            {% csrf_token %}
            {{form_1.as_p}}
            <p style="padding: 10px;"><button class="myButton" name="btnform1">Search</button></p>
        </form>

/*Table display*/
<div class="submain">
    {% if transport %}
    <table id="transportation">
        <thead>
        <th>Vehicle</th>
        <th>Carrier</th>
        <th>Location No</th>
        <th>MCMU</th>
        <th>Location</th>
        <th>Customer Code</th>
        <th>Zone</th>
        <th>Quantity</th>
        <th>RTKM</th>
        <th>KL* KM</th>
        <th>Amount</th>
        <th>Load</th>
        <th>Capacity</th>
        <th>Rate</th>
        <th>Cost</th>
        </thead>
        {% for i in transport %}
        <tr class="item">
            <td>{{ i.vehicle }}</td>
            <td>{{ i.carrier }}</td>
            <td>{{ i.location_no }}</td>
            <td>{{ i.mcmu }}</td>
            <td>{{ i.location }}</td>
            <td>{{ i.customer_code }}</td>
            <td>{{ i.zone }}</td>
            <td>{{ i.quantity }}</td>
            <td>{{ i.rtkm }}</td>
            <td>{{ i.klkm }}</td>
            <td>{{ i.amount }}</td>
            <td>{{ i.load }}</td>
            <td>{{ i.capacity }}</td>
            <td>{{ i.rate }}</td>
            <td>{{ i.cost }}</td>
        </tr>
        {% endfor %}
    </table>
</div>

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Для поиска по номеру транспортного средства. Вы можете сделать это. Я предполагаю, что у вас есть модель для Vehicle:

Models.py

class Vehicle(model.Model):
vehicle_no = models.IntegerField()
vehicle_weight = models.IntegerField()

search.html

<form action="{% url 'your_search_url' %}">
   <input type="text" name="q" placeholder="Search">
 </form>

В views.py

 def search(request):
   q = request.GET.get('q')
   if q:
      vechicles = Vehicle.object.filter(vehicle_no__contains=q)
      return render(request,'your_display_table.html',{'vehicles':vehicles})
   else:
       messages.info(request,'no results found for {} ',format(q))
       return redirect('your_view')

Для фильтрации данных со значением больше 18;

def filter(request):
  vechicles = Vehicle.object.filter(vehicle_weight__gt=18)
  return render(request,'your_display_table.html',{'vehicles':vehicles})

В шаблоне вы можете использовать так:

{% for vehicle in vehicles %}
{{vehicle.name}}
{% endfor %}
0 голосов
/ 27 июня 2019

В отображении таблицы вы можете добавить цикл с полем имени, что-то вроде этого:

Просмотр :

def search(request):
   form_1 = forms.VehicleSearch()
   if request.method == 'POST' and 'btnform1' in request.POST:
    form_1 = forms.VehicleSearch(request.POST)
    columns = request.POST.getlist('filter_hide_columns')
    if form_1.is_valid():
        vehicle_no = form_1.cleaned_data['vehicle_no']
        transport = models.Transport.objects.filter(vehicle=vehicle_no)
        my_dict.update({'transport': transport}, {'columns': columns})
  return render(request, 'search.html', my_dict)

TemplateTag

def lookup(model, attr):
    if hasattr(model, attr):
        return getattr(model, attr)
    else:
        return None

см. https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/

Шаблон :

{% if transport %}
     <table id="transportation">
        <thead>
           <tr>
             {% for field in columns %}
                <th>{{ field.name }}</th>
             {% endfor %}
           </tr>
        </thead>
        <tbody>
          {% for t in transport %}
              <tr>
                 {% for field in columns %}
                     <td>{{ t|lookup:field.name }}</td>
                 {% endfor %}
              </tr>
          {% endfor %}
        </tbody>
     </table>
{% endif %}

Пожалуйста, укажите https://docs.djangoproject.com/en/2.2/topics/forms/#looping-over-the-form-s-fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...