Django: Как отобразить результаты базы данных на основе выбора ввода формы? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь запросить базу данных для отображения результатов из формы. Как только я выбираю поля раскрывающегося списка формы для моего желаемого запроса, например Ford C -Max 2019 1.2 Petrol 1500, из которого я закодировал сейчас для отображения результатов (независимо от марки и модели, поскольку у меня только один банкомат), то вместо показав мне таблицу с совпадающими результатами, я получаю полную таблицу со всеми результатами вместо запроса, который мне нужен.

Часть того, что я получаю после отправки формы (включая результаты, которые я хочу отфильтровать):

year    liter fuel  mileage average entered

2019    1.2 Petrol  1500    12075   April 8, 2020, 11:11 p.m.
0                   None    13780   April 14, 2020, 5:25 p.m.
2018    1.6 Diesel  5000    15000   April 15, 2020, 2:23 p.m.

Что я хочу получить, выбрав 2019 1.2 Petrol et al. c. в виде:

2019    1.2 Petrol  1500    12075   April 8, 2020, 11:11 p.m.

Мой код:

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import FormView
from django.db.models import Q
from .models import Average, Query
from .forms import QueryForm

class QueryMakeModel(FormView):
        template_name = 'QueryMakeModel.html'
        success_url = '/data/'
        form_class = QueryForm

        def form_valid(self, form):
            return HttpResponse("Sweet.")

def index(request):

    if request.method == 'POST':
        FormSite = QueryForm(request.POST)
        if FormSite.is_valid():
            pass
    else:
        FormSite = QueryForm()

    return render(request, 'app/QueryMakeModel.html', {'FormSite': FormSite})

def data(request):
    if request.method == 'GET':
        query= request.GET.get('q')

        if query is not None:
            lookups= Q(mileage__icontains= query) & Q(fuel__icontains=query) & Q(liter__icontains=query) 
            & Q(year__icontains=query)

            query_results= Average.objects.filter(lookups).distinct()

            context = { 
                'query': query,
                'query_results': query_results,
            }

            return render(request, 'app/db.html', context)

db. html (страница отображения данных)

<body>
    <table class="table table-bordered" border="1" cellspacing="0" cellpadding="5">
        <thead>
            <tr>
                <th>Year</th>
                <th>Liter</th>
                <th>Fuel</th>
                <th>Mileage</th>
                <th>Average</th>
                <th>Entered</th>
            </tr>
        </thead>
        {% for Average in query_results %}
        <tbody>
            <tr>
                <td bgcolor="#F0F0F0">{{ Average.year }}</td>
                <td bgcolor="#F0F0F0">{{ Average.liter }}</td>
                <td>{{ Average.fuel }}</td>
                <td>{{ Average.mileage }}</td>
                <td>{{ Average.average }}</td>
                <td>{{ Average.entered }}</td>
            </tr>
        </tbody>
        {% endfor %}

    </table>
</body>

QueryMakeModel. html (Основная страница формы запроса)

<body>
    {% block content %}
    <h2>DoneDeal Average Price Checker</h2>
    <p></p>
    <p>Please fill the details below:</p>

    <form action="/data/" method="get">{% csrf_token %}

        {{  FormSite.as_p }}

    <button type="submit" name ='q'>
        <i class="fa fa-thumb-tack"></i> Query
    </button>
    </form>
    {% endblock %}
</body>

models.py

class Query(models.Model):  
    MAKE    = models.CharField(max_length = 50, choices=MAKES)
    MODEL   = models.CharField(max_length = 50, choices=MODELS)
    YEAR    = models.IntegerField(max_length = 4, choices=YEARS)
    LITER   = models.CharField(max_length = 3, choices=LITERS)
    FUEL    = models.CharField(max_length = 6, choices=FUELS)
    MILEAGE = models.IntegerField(max_length = 10, choices=MILEAGES)

class Average(models.Model):
    class Meta:
        db_table = 'ford_cmax'

    average = models.IntegerField(max_length = 6)
    entered = models.DateTimeField(primary_key=True)
    year    = models.IntegerField(max_length = 4)
    liter   = models.CharField(max_length = 3)
    fuel    = models.CharField(max_length = 6)
    mileage = models.IntegerField(max_length = 10)

    def __str__(self):
        return self.title

urls.py

from django.contrib import admin
from django.urls import path
from app import views
from django.conf.urls import include, url 
from app.views import QueryMakeModel

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='Index'),
    path('data/', views.data, name='Data')
]

forms.py

from django import forms  
from .models import Query, Average, YEARS, MAKES, MODELS, LITERS, FUELS, MILEAGES, DATES
import django_filters

class QueryForm(forms.ModelForm):  
    error_css_class = 'error'

    YEAR = forms.ChoiceField(choices=YEARS )
    MAKE = forms.ChoiceField(choices=MAKES, required=True )
    MODEL = forms.ChoiceField(choices=MODELS, required=True )
    LITER = forms.ChoiceField(choices=LITERS )
    FUEL = forms.ChoiceField(choices=FUELS )
    MILEAGE = forms.ChoiceField(choices=MILEAGES )
    #ENTERED = forms.ChoiceField(choices=DATES )

    class Meta:
        model = Query
        fields = ['MAKE', 'MODEL', 'YEAR', 'LITER', 'FUEL', 'MILEAGE']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...