前面两篇已经写了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>
网友评论