首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

(三)django-game:game view 编写

2024-12-18 来源:化拓教育网

前面两篇已经写了model 和xadmin 后台就已经搭建成功了
现在就写写game 的views
首先 我们给 它分分页 首页 index gamelist 游戏列表页 game 游戏详情页

首先来index
from django.shortcuts import render
from django.views.generic.base import View

# Create your views here.
from .models import Games, Category, Tags


class GameIndexView(View):
    def get(self, request):
        # 自己还可以添加更多的  分类 我这里 就先写这么多
        all_category = Category.objects.all()  # 二级类别直接用他的外键显示
        new_games = Games.objects.filter(is_new=True)[:50]  # 最新的吧 50个
        hot_games = Games.objects.filter(is_hot=True)[:5]  # 最热 5
        fav_games = Games.objects.order_by('-fav_num')[:5]  # 收藏最多的游戏
        return render(request, 'index.html', {
            "all_category": all_category,
            "new_games": new_games,
            "hot_games": hot_games,
            "fav_games": fav_games,
        })
然后是 gamelist

提供了一个tag_id 同时 进行了 分页 分页 只显示一个 容易测试 功能 可随意更改
下面的 get_games 是 在model中写方法 在下面 我会讲

#首页只提供显示 不提供  筛选 最后用户点击一个类别 就会跳到 一个新的页面
class GamelistView(View):
    def get(self,request,tag_id):
        tag = Tags.objects.get(id=tag_id).get_games()
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1

        # Provide Paginator with the request object for complete querystring generation
        p = Paginator(tag, 1, request=request)   #这里的1  为 1 个 为一个
        tag = p.page(page)
        return render(request,'gamelist.html',{
            'tag':tag
        })
最后是 game

提供一个game_id

class GamedetailView(View):
    def get(self, request, game_id):
        game = Games.objects.get(id=game_id)
        hot_games = Games.objects.filter(is_hot=True)[:5]  # 最热 5
        fav_games = Games.objects.order_by('-fav_nums')[:5]  # 收藏最多的游戏

        return render(request, 'game.html', {
            'game': game,
            "hot_games": hot_games,
            "fav_games": fav_games,
        })
然后 就是配置 urls
import xadmin
from django.conf.urls import url
from django.contrib import admin

from game.views import GamedetailView,GameIndexView,GamelistView

urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
    url(r'^$', GameIndexView.as_view(),name='index'),   #首页
    url(r'^gamelist/(?P<tag_id>.*)/$', GamelistView.as_view(),name='gamelist'),#游戏列表
    url(r'^games/(?P<game_id>.*)/$', GamedetailView.as_view(),name='games'),#游戏详情
]
前端填写内容的时候 我在model中定义了 一些方法

game 目录下 model Tags 添加下列方法

    def get_games(self):
        #获取有这个标签的所有游戏
        return self.games_set.all()

在model Category中 添加

    def get_tags(self):
        #获取所有属于这个类别的标签
        return  self.tags_set.all()

下面是templates 没有前端页面 所以我就直接测试能否显示 和跳转 后期在看是否编写前端页面

index
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for category in all_category %}
    <a href="#">{{ category.name }}</a>
    {% for tag in category.get_tags %}
        <a href="{% url 'gamelist' tag.id %}">{{ tag.name }}</a>
        {% endfor %}
{% endfor %}
</body>
</html>
gamelist
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ game.name }}</title>
</head>
<body>
<div>
    {% for game in tag.object_list %}
        <a href="{% url 'games' game.id %}">{{ game.name }}</a>
    {% endfor %}
</div>
<div class="pageturn">
    <ul class="pagelist">
        {% if tag.has_previous %}
            <li class="long"><a href="?{{ tag.previous_page_number.querystring }}">上一页</a></li>
        {% endif %}
        {% for page in tag.pages %}
            {% if page %}
                {% ifequal page tag.number %}
                    <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
                {% else %}
                    <li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li>
                {% endifequal %}
            {% else %}
                <li class="none"><a href="">...</a></li>
            {% endif %}
        {% endfor %}
        {% if tag.has_next %}
            <li class="long"><a href="?{{ tag.next_page_number.querystring }}">下一页</a></li>
        {% endif %}
    </ul>
</div>
</body>
</html>
game
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ game.name }}
{{ game.fav_nums }}
</body>
</html>

这样 就设计的差不多了 后面 就是 用户个人信息的编写了

显示全文