美文网首页python学习实践WEB前端程序开发程序员
Django学习记录第九天—机构列表页完善

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

作者: Rokkia | 来源:发表于2017-06-30 20:28 被阅读120次

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

    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.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'),
    ]
    

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

    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

    在页面中是这一部分。

    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.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中

    image.png image.png

    OK没毛病。

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

    <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,这样就行了。我们的数据量有点少,大家可以多添加一些。

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

    坚持三十天,一起加油!

    相关文章

      网友评论

        本文标题:Django学习记录第九天—机构列表页完善

        本文链接:https://www.haomeiwen.com/subject/tuobcxtx.html