通过两种形式实现搜索 django



我想通过两个参数形式实现搜索:首页.html

<form action="{% url 'search_results' %}" method="get">
<input name="q" type="text" placeholder="Search...">
<select name="q2" class="form-control" id="exampleFormControlSelect1">
<option>All locations</option>
<option>RU</option>
<option>Ukraine</option>
<option>USA</option>
</select>
<button> Search </button>
</form>

当我点击"搜索"时,没关系(我去 http://127.0.0.1:8001/search/?q=mos&q2=RU( 但是当我点击"下一步"时,我收到

http://127.0.0.1:8001/search/?city=2&q=mos&q2=

但我需要

http://127.0.0.1:8001/search/?city=2&q=mos&q2=RU

我该如何解决这个问题?

<a href="/search?city={{ page_obj.next_page_number }}&q={{ query }}&q2= {{query}}">next</a>

完整代码:search_results.html

<h1>Search Results</h1>
<ul>
{% for city in object_list %}
<li>
{{ city.name }}, {{ city.state }}
</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/search?city={{ page_obj.previous_page_number }}&q={{ query }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="/search?city={{ page_obj.next_page_number }}&q={{ query }}&q2= {{query}}">next</a>
{% endif %}
</span>
</div>

views.py

from django.shortcuts import render
from django.views.generic import TemplateView, ListView
from .models import City
from django.db.models import Q
from django.shortcuts import render, get_object_or_404

class HomePageView(ListView):
model = City
template_name = 'cities/home.html'
paginate_by = 3
page_kwarg = 'city'
def city_detail(request, pk):
city = get_object_or_404(City, pk=pk)
return render(request, 'cities/city_detail.html', {'city': city})

class SearchResultsView(ListView):
model = City
template_name = 'cities/search_results.html'
paginate_by = 3
page_kwarg = 'city'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['query'] = self.request.GET.get('q')
return context
def get_queryset(self): # new
query = self.request.GET.get('q')
query2 = self.request.GET.get('q2')
print("AAAAAAAAAAAAAAAAAAAAA", query2, type(query2))
object_list = City.objects.filter(
(Q(name__icontains=query) | Q(state__icontains=query)) & Q(category=query2)
)
return object_list

models.py

from django.db import models
class City(models.Model):
name = models.CharField(max_length=255)
state = models.CharField(max_length=255)
COUNTRY = (
('RU', 'Russia'),
('UKR', 'Ukraine'),
('US', 'USA'),
)
category = models.CharField(max_length=100, choices=COUNTRY, default='RU')
class Meta:
verbose_name_plural = "cities"
def __str__(self):
return self.name

您需要更新get_context_data以将q2传递给模板计算器。 并将其用于在模板中构建 url。

像这样的东西

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['query'] = self.request.GET.get('q')
#added param
context['query2'] = self.request.GET.get('q2')
return context

在模板中使用query2

<span class="page-links">
{% if page_obj.has_previous %}
<a href="/search?city={{ page_obj.previous_page_number }}&q={{ query }}&q2= {{query2}}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="/search?city={{ page_obj.next_page_number }}&q={{ query }}&q2= {{query2}}">next</a>
{% endif %}
</span>

注意:您没有在链接中使用q2,也添加它。

最新更新