Я пытаюсь запросить базу данных для отображения результатов из формы. Как только я выбираю поля раскрывающегося списка формы для моего желаемого запроса, например 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']