上一篇我们已经算是将界面与数据基本构建好了,接下来就是最好玩的部分了,就是数据处理。这是我最喜欢的部分。
html有了,我们先来配置一下我们的url。
来到TestProject目录下的url,添加一下url
- url
url(r'^user/', include('users.urls', namespace='users')),
然后我们再来到我们的organization app目录下,设置一下我们的urls。首先创建urls.py文件,将TestProject目录下的url内容copy过去,只留下一个url的就OK了。
image.pngIndexView飘红,是因为我们需要定义我们的View。
- 创建View
from django.shortcuts import render
from django.views.generic import View
class OrganizationListView(View):
def get(self, request):
return render(request, 'org-list.html', {})
修改urls.py
from django.conf.urls import url
from organization.views import OrganizationListView
urlpatterns = [
url(r'^list/', OrganizationListView.as_view(), name='org_list'),
]
我们来看看界面在做后面的工作.
image.png我们可以看到我们的sub_title有点问题。
果然,粗心,贴错代码了,修改一下。
{% block sub_title %}
<ul class="crumbs">
<li><a href="index.html">首页</a>></li>
<li>授课机构</li>
</ul>
{% endblock %}
OK ,搞定。
- 数据查询
然后我们来查询一下我们的数据,怎么查呢,之前又说到objects.all() .filter() .get() .orderby()...,这里我们先将所有的都查出来,使用all()
导入头文件先。
from .models import Organization
查询数据
all_org = Organization.objects.all()
使用数据
return render(request, 'org-list.html', {
'all_org': all_org,
})
这样我们的数据就查询出来了,接下来我们怎么做的,我们需要在html中显示一下我们的数据。我们先解决一下左边这一部分。
image.png也就是这个div里的内容。
其实我们能发现,最核心的部分就是这一块。
在页面中是这一部分。
image.png- html 修改
我们在html中配置一下。
#使用for循环来
{% for org in all_orgs %}
<dl class="des difdes">
<dt>
<a href="org-detail-homepage.html">
<img width="200" height="120" class="scrollLoading" data-url="{{ MEDIA_URL }}{{ org.image }}"/>
</a>
</dt>
<dd>
<div class="clearfix">
<a href="org-detail-homepage.html">
#使用org.name
<h1>{{ org.name }}</h1>
<div class="pic fl">
#一不小心就用到了static
![]({% static 'images/authentication.png' %})
![]({% static 'images/gold.png' %})
</div>
</a>
</div>
<ul class="cont">
#这里的课程数,我们后期来解决
#配置学习人数
<li class="first"><p class="pic9">课程数:<span>1</span></p><p class="c7">学习人数:<span>{{ org.students_num }}</span></p></li>
#配置地址
<li class="c8" style="padding-left:18px;">{{ org.address }}</li>
#配置经典课程
<li class="pic10" style="padding-left:18px;">经典课程:
<a href="/diary/19/">C原因</a>
<a href="/diary/16/">数据库基础</a>
</li>
</ul>
</dd>
<div class="buy start_groupbuy jsShowPerfect2" data-id="22"><br/>联系<br/>服务</div>
</dl>
{% endfor %}
使用的方法都在我添加注释的位置,我们发现课程数量与包含的经典课程我们是没有的,我们来获取一下。
这里有一个问题,这两个的值都是Course的,而Organization是Course的外键,我们看看怎么通过外键获取包含这个外键的值。
说实话,我个人觉着这一部分是一个很重要的部分,不光是能解决这个问题,对我来说,对python也有了一些新理解。
这里我们需要来到Organization的model.py中,给Organization来定义一个函数,这个函数有什么用呢?用来返回对象与数量,其实最关键的还是使用xxx_set()方法来获取包含此对象的值s.
class Organization(models.Model):
#由于长度问题之前那些就不显示了
...
...
def get_course_count(self):
return self.coursemodel_set.all().count()
def get_all_courses(self):
return self.coursemodel_set.all()
这里定义好了之后我们直接在html中使用即可。
<ul class="cont">
#还有这里
<li class="first"><p class="pic9">课程数:<span>{{ org.get_course_count }}</span></p><p class="c7">学习人数:<span>{{ org.students_num }}</span></p></li>
<li class="c8" style="padding-left:18px;">{{ org.address }}</li>
<li class="pic10" style="padding-left:18px;">经典课程:
#看这里看这里
{% for course in org.get_all_courses %}
<a href="/diary/19/">{{ course.name }}</a>
{% endfor %}
</li>
</ul>
注意,我们在使用的时候不需要使用括号。为什么我们可以直接使用呢,原因很简单,首先org是一个对象,get_all_courses与get_course_count都是他的方法,自然可以使用。
image.png没有任何问题。
image.png这里有个15家怪怪的,我们来处理一下。这里我们只需要使用count()函数即可。
def get(self, request):
all_orgs = Organization.objects.all()
org_count = Organization.objects.count()
return render(request, 'org-list.html', {
'all_orgs': all_orgs,
'org_count': org_count,
})
<div class="all">共<span class="key">{{ org_count }}</span>家</div>
搞定。
下面我们来处理一个有趣的东西。
- 排序
其实呢排序并没有什么难度,我们只需要调用order_by()函数即可,比较复杂的是参数传递。我们处理的也就是这一部分。
image.png先找到这一部分。
image.png我们可以看到,这部分其实是几个a标签,不同的是href后面添加了sort=这个参数。
我们在view中的request中就需要捕获这个参数。
class OrganizationListView(View):
def get(self, request):
all_orgs = Organization.objects.all()
org_count = Organization.objects.count()
#看这里看这里
sort = request.GET.get('sort', '')
if sort == 'students':
all_orgs = all_orgs.order_by('-students_num')
if sort == 'courses':
all_orgs = all_orgs.order_by('-course_num')
return render(request, 'org-list.html', {
'all_orgs': all_orgs,
'org_count': org_count,
})
我们使用order_by('-students_num') 使用-是为了倒序排序。
这样,我们在操作的时候就可以了。
我们可以在xadmin中添加一点假数据检测一下,没有问题。
还有就是这里了。其实这里跟排序很像,不过这里我们会用到筛选,也就是filter()
image.png由于我们没有类别这个属性,所以我们来添加一个。
class Organization(models.Model):
#由于过长就不都显示了
...
category = models.CharField(max_length=10, choices=(('px', u'培训'), ('gx', u'高校'), ('gr', u'个人')), default='gx', verbose_name=u'机构类别')
然后提交这里就不说了,来看一下数据库。
image.png我们直接来修改一下.
image.png然后看一下这里的a标签。
image.pngView中我们需要获取ct这个字段。
ct = request.GET.get('ct', '')
if len(ct) > 0:
all_orgs = all_orgs.filter(category=ct)
image.png
为了让这里的点击有效果,我们需要将ct穿回去,同样sort也是一样。
return render(request, 'org-list.html', {
'all_orgs': all_orgs,
'org_count': org_count,
'sort': sort,
'ct': ct,
})
html中
image.png image.pngOK没毛病。
最后一个地方就是,当我们点击排序后我们发现我们无法再选分类了。这是因为我们需要将分类这个选项也发过去。
改写
<div class="cont">
<a href="?city="><span {% ifequal ct '' %}class="active2"{% endifequal %}>全部</span></a>
# 这里href需要将sort也一起传过去!!!
<a href="?sort={{ sort }}&ct=px&city="><span {% ifequal ct 'px' %}class="active2"{% endifequal %}>培训机构</span></a>
<a href="?sort={{ sort }}&ct=gx&city="><span {% ifequal ct 'gx' %}class="active2"{% endifequal %}>高校</span></a>
<a href="?sort={{ sort }}&ct=gr&city="><span {% ifequal ct 'gr' %}class="active2"{% endifequal %}>个人</span></a>
</div>
OK,这样就行了。我们的数据量有点少,大家可以多添加一些。
网友评论