Представление на основе классов Django для запроса базы данных из формы и отображения результатов - PullRequest
0 голосов
/ 05 октября 2018

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

search.html

<div class="container">
    <form method="GET" action="{% url 'search' %}">
        <div class="form-group">
            <input type="text" name="make" placeholder="Car Make" />
            <label>
                <button type="submit" class="btn btn-danger"> Go </button>
            </label>
        </div>
    </form>

{% if results %}
<table>
    <tr>
        <th scope="col"></th>
        <th scope="col">Car Make</th>
        <th scope="col">Car Model</th>
        <th scope="col">Car Type</th>
        <th scope="col">Number of Seats</th>
        <th scope="col">Price</th>
    </tr>
    {% for item in results%}
    <tr>
        <td>{{item.makename}}</td>
        <td>{{item.model}}</td>
        <td>{{item.seriesname}}</td>
        <td>{{item.seatingcapacity}}</td>
        <td>{{item.pricenew}}</td>
    </tr>
    {% endfor %}
</table>
{% endif %}

</div>

views.py

class SearchView(TemplateView):

    template_name = 'carproject/search.html'
    model = Vehicles

    def get(self, request):
        form = AdvancedSearch()
        return render(request, self.template_name, {'form': form})

    def search(self, request):
        makequery = self.request.GET.get['make']
        if makequery:
            results = self.Vehicles.objects.filter(makename__icontains(makequery))
        return render(request, self.template_name, {'results': results})

Models.py

class Vehicles(models.Model):
    carid = models.IntegerField(db_column='CarID', primary_key=True)
    makename = models.CharField(db_column='MakeName', max_length=45)
    model = models.CharField(db_column='Model', max_length=45)
    seriesname = models.CharField(db_column='SeriesName', max_length=45)
    seriesyear = models.TextField(db_column='SeriesYear') 
    pricenew = models.IntegerField(db_column='PriceNew')
    fuelsystem = models.CharField(db_column='FuelSystem', max_length=45)
    enginesize = models.CharField(db_column='EngineSize', max_length=10) 
    tankcapacity = models.CharField(db_column='TankCapacity', max_length=10)
    power = models.CharField(db_column='Power', max_length=10)
    seatingcapacity = models.IntegerField(db_column='SeatingCapacity')
    standardtransmission = models.CharField(db_column='StandardTransmission', max_length=45)
    bodytype = models.CharField(db_column='BodyType', max_length=45)
    drive = models.CharField(db_column='Drive', max_length=3)
    wheelbase = models.CharField(db_column='WheelBase', max_length=10)
    class Meta:
        managed = False
        db_table = 'vehicles'

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете просто сделать Vehicles.objects.filter(makename__icontains=request.GET.get("make","somevalueasdefault")) в своей функции get.Может быть, я что-то упускаю, но я не уверен, почему вы представили представление в виде на основе классов.В качестве примера вы можете сделать, как показано ниже.

class SearchView(TemplateView):
    template_name = "carproject/search.html"

    def get(self, kwargs):
      context = super(SearchView, self).get_context_data(**kwargs)
      context['queryset'] = Vehicles.objects.filter(makename__icontains=request.GET.get("make","sdefault"))
      return context
...