Django学习记录第九天—机构列表页完善

上一篇我们已经算是将界面与数据基本构建好了,接下来就是最好玩的部分了,就是数据处理。这是我最喜欢的部分。

html有了,我们先来配置一下我们的url。
来到TestProject目录下的url,添加一下url

  • url
url(r'^user/', include('users.urls', namespace='users')),

然后我们再来到我们的organization app目录下,设置一下我们的urls。首先创建urls.py文件,将TestProject目录下的url内容copy过去,只留下一个url的就OK了。

Django学习记录第九天—机构列表页完善_第1张图片
image.png

IndexView飘红,是因为我们需要定义我们的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'),
]

我们来看看界面在做后面的工作.

Django学习记录第九天—机构列表页完善_第2张图片
image.png

我们可以看到我们的sub_title有点问题。

果然,粗心,贴错代码了,修改一下。

{% block sub_title %}
    
{% 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中显示一下我们的数据。我们先解决一下左边这一部分。

Django学习记录第九天—机构列表页完善_第3张图片
image.png

也就是这个div里的内容。
其实我们能发现,最核心的部分就是这一块。

Django学习记录第九天—机构列表页完善_第4张图片
image.png

在页面中是这一部分。

Django学习记录第九天—机构列表页完善_第5张图片
image.png
  • html 修改

我们在html中配置一下。

#使用for循环来
{% for org in all_orgs %}
    #这里的课程数,我们后期来解决 #配置学习人数
  • 课程数:1

    学习人数:{{ org.students_num }}

  • #配置地址
  • {{ org.address }}
  • #配置经典课程
  • 经典课程: C原因 数据库基础

联系
服务
{% 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中使用即可。

    #还有这里
  • 课程数:{{ org.get_course_count }}

    学习人数:{{ org.students_num }}

  • {{ org.address }}
  • 经典课程: #看这里看这里 {% for course in org.get_all_courses %} {{ course.name }} {% endfor %}

注意,我们在使用的时候不需要使用括号。为什么我们可以直接使用呢,原因很简单,首先org是一个对象,get_all_courses与get_course_count都是他的方法,自然可以使用。

Django学习记录第九天—机构列表页完善_第6张图片
image.png

没有任何问题。

Django学习记录第九天—机构列表页完善_第7张图片
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,
    })
{{ org_count }}

搞定。

下面我们来处理一个有趣的东西。

  • 排序

其实呢排序并没有什么难度,我们只需要调用order_by()函数即可,比较复杂的是参数传递。我们处理的也就是这一部分。

image.png

先找到这一部分。

Django学习记录第九天—机构列表页完善_第8张图片
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'机构类别')

然后提交这里就不说了,来看一下数据库。

Django学习记录第九天—机构列表页完善_第9张图片
image.png

我们直接来修改一下.

image.png

然后看一下这里的a标签。

image.png

View中我们需要获取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中

Django学习记录第九天—机构列表页完善_第10张图片
image.png
Django学习记录第九天—机构列表页完善_第11张图片
image.png

OK没毛病。

最后一个地方就是,当我们点击排序后我们发现我们无法再选分类了。这是因为我们需要将分类这个选项也发过去。
改写

全部 # 这里href需要将sort也一起传过去!!! 培训机构 高校 个人

OK,这样就行了。我们的数据量有点少,大家可以多添加一些。

资料下载地址
资料直接下载

坚持三十天,一起加油!

你可能感兴趣的:(Django学习记录第九天—机构列表页完善)