from django.shortcuts import render, redirect from django.core.paginator import Paginator from django.core.paginator import EmptyPage from django.core.paginator import PageNotAnInteger from django.shortcuts import reverse from django.db.models import Q, F from index.models import * def searchView(request, page): if request.method == 'GET': searchs = Dynamic.objects.select_related('video').order_by('-search').all()[:6] kword = request.session.get('kword', '') if kword: videos = Video.objects.filter(Q(name__icontains=kword) | Q(author=kword)).order_by('-release').all() else: videos = Video.objects.order_by('-release').all()[:50] paginator = Paginator(videos, 5) try: pages = paginator.page(page) except PageNotAnInteger: pages = paginator.page(1) except EmptyPage: pages = paginator.page(paginator.num_pages) if kword: idList = Video.objects.filter(name__icontains=kword) for i in idList: dynamics = Dynamic.objects.filter(video_id=i.id) if dynamics: dynamics.update(search=F('search') + 1) else: dynamic = Dynamic(plays=0, search=1, download=0, video_id=i.id) dynamic.save() return render(request, 'search.html', locals()) else: request.session['kword'] = request.POST.get('kword', '') return redirect(reverse('search', kwargs={'page': 1}))
时间: 2024-04-27 11:21:44 浏览: 11
这段代码是一个 Django 视图函数,用于处理用户的搜索请求。它的作用是:
1. 如果是 GET 请求,从数据库中获取最热门的 6 个视频,并根据用户输入的关键词搜索相关视频。如果没有关键词,则返回最新的 50 个视频。
2. 将搜索结果分页,并根据用户请求的页码返回对应的页面。如果页码不是整数,则返回第一页;如果页码超出范围,则返回最后一页。
3. 如果有关键词,则根据关键词更新相应视频的搜索次数。
4. 最后将搜索结果渲染到模板 search.html 中,并返回给用户。如果是 POST 请求,则将用户输入的关键词保存在会话中,并重定向到第一页搜索结果。
相关问题
Django之分页器小插件
在Django中,分页是一个常见的需求,为了方便处理分页,可以使用Django内置的分页器Paginator。
Paginator的使用方法很简单,我们可以将一个QuerySet对象或者一个列表作为参数传入Paginator中,然后就可以使用Paginator提供的一些方法来进行分页操作。下面是一个简单的分页器小插件的代码:
```python
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def paginate(objects, page=1, per_page=10):
"""
分页器小插件
"""
paginator = Paginator(objects, per_page)
try:
paginated_objects = paginator.page(page)
except PageNotAnInteger:
paginated_objects = paginator.page(1)
except EmptyPage:
paginated_objects = paginator.page(paginator.num_pages)
return paginated_objects
```
上面的代码定义了一个名为paginate的函数,它接受三个参数:
- objects:需要进行分页的对象,可以是一个QuerySet对象或者一个列表。
- page:当前页码,默认为1。
- per_page:每页显示的条目数量,默认为10。
函数中首先使用Paginator来对objects进行分页操作,并使用try/except语句来处理异常情况。如果page参数不是一个整数,则将page设置为1;如果page参数超出了可用的页码范围,则将page设置为最大页码数(paginator.num_pages)。
最后,函数返回一个分页后的对象(paginated_objects),可以在Django模板中使用该对象来渲染分页器。
使用该分页器小插件的示例代码如下:
```python
from django.shortcuts import render
from .models import MyModel
from .utils import paginate
def my_view(request):
my_objects = MyModel.objects.all()
paginated_objects = paginate(my_objects, request.GET.get('page'))
return render(request, 'my_template.html', {'paginated_objects': paginated_objects})
```
在上面的代码中,我们首先获取所有的MyModel对象,然后使用paginate函数将其分页,最后将分页后的对象传递给模板进行渲染。
在模板中,可以使用Django内置的分页器标签({% for obj in paginated_objects %}、{% if paginated_objects.has_previous %}等)来渲染分页器。
用Django写一个HTML页码
这是一个比较常见的需求,你可以使用 Django 自带的分页模块来实现。以下是一个简单的示例:
1. 在 views.py 中定义一个视图函数,用于处理分页请求:
```python
from django.core.paginator import Paginator
from django.shortcuts import render
def my_view(request):
# 获取数据
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 创建分页对象,每页显示 3 条数据
paginator = Paginator(data, 3)
# 获取当前页码
page_number = request.GET.get('page')
# 获取当前页的数据
page_obj = paginator.get_page(page_number)
# 渲染模板
return render(request, 'my_template.html', {'page_obj': page_obj})
```
2. 在模板中使用分页对象渲染页码:
```html
{% if page_obj.has_other_pages %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endif %}
```
这样就可以在页面中显示出简单的页码了。当然,你可以根据自己的需求进行定制化。