Python 分页在第一页上不起作用。当前路径&;空缺=2,没有';我一个也配不上
我正在Django中实现分页搜索。 单击下一个分页按钮时,收到错误: 找不到页面(404) 请求方法:获取 请求URL: 此外,搜索后分页也可以工作(例如,我搜索了一些内容,然后单击分页,它就工作了) 我认为views.py和url.py的问题 我怎样才能解决这个问题 型号.pyPython 分页在第一页上不起作用。当前路径&;空缺=2,没有';我一个也配不上,python,django,Python,Django,我正在Django中实现分页搜索。 单击下一个分页按钮时,收到错误: 找不到页面(404) 请求方法:获取 请求URL: 此外,搜索后分页也可以工作(例如,我搜索了一些内容,然后单击分页,它就工作了) 我认为views.py和url.py的问题 我怎样才能解决这个问题 型号.py class Company(models.Model): name = models.CharField(max_length=200) about = models.TextField()
class Company(models.Model):
name = models.CharField(max_length=200)
about = models.TextField()
def __str__(self):
return self.name
class Vacancy(models.Model):
company_key = models.ForeignKey(Company, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
salary = models.CharField(max_length=200, default='40.000')
text = models.TextField(default="The text about vacancy")
city = models.CharField(max_length=200, default='Москва')
date_str = models.CharField(max_length=50, default='12 сентября')
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
CHOICES = [
('ALL', 'ALL'),
('IT', 'IT'),
('FINANCE', 'FINANCE'),
('OTHER', 'OTHER'),
]
department = models.CharField(
max_length=20,
choices=CHOICES,
default='ALL',
)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
urlpatterns = [
path('', HomePageView.as_view(), name='vacancy_list'),
path('search/', SearchResultsView.as_view(), name='search_results'),
path('vacancy/<int:pk>/', views.vacancy_detail, name='vacancy_detail'),
path('accounts/login/', BBLoginView.as_view(), name='login'),
path('accounts/profile/', profile, name='profile'),
path('accounts/logout/', BBLogoutView.as_view(), name='logout'),
...
class HomePageView(ListView):
model = Vacancy
template_name = 'vacancy_list/vacancy_list.html'
paginate_by = 5
page_kwarg = 'vacancy'
context_object_name = 'vacancies'
def vacancy_detail(request, pk):
vacancy = get_object_or_404(Vacancy, pk=pk)
return render(request, 'vacancy_list/vacancy_detail.html', {'vacancy': vacancy})
class SearchResultsView(ListView):
model = Vacancy
template_name = 'vacancy_list/search_results.html'
paginate_by = 5
page_kwarg = 'vacancy'
context_object_name = 'vacancies'
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
def get_queryset(self): # new
query = self.request.GET.get('q')
query2 = self.request.GET.get('q2')
object_list = Vacancy.objects.filter(
Q(title__icontains=query) and Q(department__icontains=query2)
)
return object_list
url.py
class Company(models.Model):
name = models.CharField(max_length=200)
about = models.TextField()
def __str__(self):
return self.name
class Vacancy(models.Model):
company_key = models.ForeignKey(Company, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
salary = models.CharField(max_length=200, default='40.000')
text = models.TextField(default="The text about vacancy")
city = models.CharField(max_length=200, default='Москва')
date_str = models.CharField(max_length=50, default='12 сентября')
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
CHOICES = [
('ALL', 'ALL'),
('IT', 'IT'),
('FINANCE', 'FINANCE'),
('OTHER', 'OTHER'),
]
department = models.CharField(
max_length=20,
choices=CHOICES,
default='ALL',
)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
urlpatterns = [
path('', HomePageView.as_view(), name='vacancy_list'),
path('search/', SearchResultsView.as_view(), name='search_results'),
path('vacancy/<int:pk>/', views.vacancy_detail, name='vacancy_detail'),
path('accounts/login/', BBLoginView.as_view(), name='login'),
path('accounts/profile/', profile, name='profile'),
path('accounts/logout/', BBLogoutView.as_view(), name='logout'),
...
class HomePageView(ListView):
model = Vacancy
template_name = 'vacancy_list/vacancy_list.html'
paginate_by = 5
page_kwarg = 'vacancy'
context_object_name = 'vacancies'
def vacancy_detail(request, pk):
vacancy = get_object_or_404(Vacancy, pk=pk)
return render(request, 'vacancy_list/vacancy_detail.html', {'vacancy': vacancy})
class SearchResultsView(ListView):
model = Vacancy
template_name = 'vacancy_list/search_results.html'
paginate_by = 5
page_kwarg = 'vacancy'
context_object_name = 'vacancies'
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
def get_queryset(self): # new
query = self.request.GET.get('q')
query2 = self.request.GET.get('q2')
object_list = Vacancy.objects.filter(
Q(title__icontains=query) and Q(department__icontains=query2)
)
return object_list
空缺列表.html
{% block content %}
<div class="container col-md-8" style="margin:20px;">
<div class="container" style="margin-top: 40px; font-size: 2rem; padding-left: 0px;">
<form action="{% url 'search_results' %}" method="get">
<div class="row">
<div class="col-lg-8 col-md-6 col-xs-12">
<input name="q" type="text" placeholder="Search..." class="form-control">
</div>
<div class="col-lg-3 col-md-4 col-xs-12">
<select name="q2" class="form-control" id="exampleFormControlSelect1">
<option>ALL</option>
<option>IT</option>
<option>Finance</option>
<option>Other</option>
</select>
</div>
<div class="col-lg-1 col-md-2 col-xs-12" style="padding-left: 0px;">
<button class="btn btn-primary">Primary</button>
</div>
</div>
</form>
</div>
{% for vacancy in vacancies %}
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-md-8">
<h1><a href="{% url 'vacancy_detail' pk=vacancy.pk %}">{{vacancy.title}}</a></h1>
</div>
<div class="col-md-4 text-right">
<p> {{ vacancy.salary}} </p>
</div>
</div>
</div>
<div class="card-body" style="white-space:normal">
<p class="text-secondary">{{vacancy.company_key.name}}</p>
<p> Описание вакансии: Компания Sixhands, занимающаяся разработкой мобильных приложений и веб-порталов в Санкт-Петербурге, ищет Backend-разработчика для создания серверной части мобильных приложений.
<div class="row">
<div class="col-md-8">
<p>{{vacancy.city}} </p>
</div>
<div class="col-md-4 text-right">
<p> {{vacancy.date_str }} </p>
</div>
</div>
</div>
</div>
{% endfor %}
<!-- Paginator -->
<div class="container" style="font-size: 2rem;">
<div class="row justify-content-center">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item"><a class="page-link" href="{{ request.get_full_path }}?vacancy={{ page_obj.previous_page_number }}">Previous</a></li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Previous</span>
</li>
{% endif %}
<li class="page-item disabled">
<span class="page-link">Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}</span>
</li>
{% if page_obj.has_next %}
<li class="page-item"><a class="page-link" href="{{ request.get_full_path }}?vacancy={{ page_obj.next_page_number }}">Next</a></li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Next</span>
</li>
{% endif %}
</ul>
</div>
</div>
</div> <!-- wrapper end -->
{% endblock %}
{%block content%}
全部的
信息技术
财务
其他
主要的,重要的
{空缺百分比中的空缺百分比}
{{空缺.薪金}
{{{emptance.company_key.name}
аааааааааааааааааа六手,заааааааааааааааа,后端-后端-后端。
{{空缺.城市}
{{空缺日期{u str}}
{%endfor%}
{%如果页面_obj.has_previous%}
{%else%}
-
以前的
{%endif%}
-
第{{Page_obj.paginator.num_pages}页中的{{{Page_obj.number}}
{%如果页面_obj.has_next%}
{%else%}
-
下一个
{%endif%}
{%endblock%}
查询字符串以URL路径后的?
开头,附加
由于您有/&emptance=2
,它被视为(或部分)常规URL路径,因此与URL模式中的URL匹配。由于没有这样的URL,您将得到404
因此,将和替换为?
当您有多个查询Sting时,您需要使用&
作为分隔符,例如/spam/egg/?page=2&foo=bar
编辑:
要防止保留上一个查询字符串,请在模板中使用request.path
(返回不带查询字符串的当前路径)而不是request.get\u full\u path()
(返回带查询字符串的当前路径):
href="{{ request.path }}
谢谢,但是当我点击两次时,收到了错误(错误的url)@alcoder检查您的模板空缺列表/空缺列表.html
,看看您是如何生成分页url的。似乎您正在保留查询字符串(例如,通过使用查询字符串引用当前URL),删除它们,仅使用URL路径。