当前位置:   article > 正文

django进阶(一)_django 进阶

django 进阶

上下文管理器
多对多关联
分页
丰富django admin
form

  • 上下文管理器

1.概念:上下文处理器是可以返回一些数据,在全局模板中都可以使用。比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每个视图函数中都返回这个对象。

2.为何要使用?
如果我们不使用上下文处理器的话,那么我们需要在每一个视图函数中都去获取一下session中的user_id,这就是一件很不爽的事情了,而如果我们定义了上下文处理器,那么我们就不需要每一个视图函数中都去获取session中user_id的值了,只需要在上下文处理器中去获取就是了。

3.app目录下新建一个context_processors.py的文件

from . import models

def category_process(request):
    categories = models.Category.objects.filter(is_delete=False)
    return  {'nav':categories}

def site_process(request):
    site_name = '王庆柱的博客'
    desc = "今天很困,一会要抽烟"
    return locals() #把当前函数里面的局部变量都返回
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.sitting.py进行配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                    os.path.join(BASE_DIR, 'html')
                 ]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'user.process_content.category_process',
                #上下文处理器
                'user.process_content.site_process'

            ],
        },
    },
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

模板继承

建立一个base.html

模板的继承,主要的作用就是实现模板内html代码的重复利用,方便维护和修改,比如一个网站每个网页的页头和页脚信息固定,这样就不需要在每个html页面加入页头和页尾代码,只需要在一个html文件中创建一个模板,其他html页面直接引用即可

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block test1 %}
    “此处是要展示的页头信息”
{% endblock %}
{% block content %}
    "此处是要替换的内容"
{% endblock %}
{% block test2 %}
    “此处是要展示的页尾信息”
{% endblock %}
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

其中的两个block就是等待被继承的信息。

此时如果要文件home.html来继承,在文件里面直接展示出页头和页尾信息,这样就只需要在home中引用base.html

{% extends ‘base.html’ %}

然后再指定需要替换的模板,比如我是要在home中,保持home内容完全展示的基础上,再加上页头和页尾信息。

这样,我就只需要替换{% block content %}
“此处是要替换的内容”
{% endblock %} 这个block中的内容,保留页头和页尾的block。具体的实现如下

{% extends 'base.html' %}
{% load my_tag %}

{% block content %}
    <article>
        <aside>
            <div class="l_box" id="stickMe">
                <div class="about_me">
                    <h2>关于我</h2>
                    <ul>
                        <i><img src="/static/images/4.jpg"></i>
                        <p>{{ desc }}</p>
                    </ul>
                </div>
                <div class="wdxc">
                    <h2>我的相册</h2>
                    <ul>
                        <li><a href="/"><img src="/static/images/7.jpg"></a></li>
                       
                    </ul>
                </div>
                <div class="search">
                    <form action="/e/search/index.php" method="post" name="searchform" id="searchform">
                        <input name="keyboard" id="keyboard" class="input_text" value="请输入关键字词"
                               style="color: rgb(153, 153, 153);"
                               onfocus="if(value=='请输入关键字词'){this.style.color='#000';value=''}"
                               onblur="if(value==''){this.style.color='#999';value='请输入关键字词'}" type="text">
                        <input name="show" value="title" type="hidden">
                      class="input_submit" value="搜索" type="submit">
                    </form>
                </div>
                <div class="fenlei">
                    <h2>文章分类</h2>
                    <ul>
                        <li><a href="/">学无止境(33</a></li>
                       
                    </ul>
                </div>
                <div class="tuijian">
                    <h2>站长推荐</h2>
                    <ul>
                        <li><a href="/">你是什么人便会遇上什么人</a></li>
                    
                    </ul>
                </div>
                <div class="links">
                    <h2>友情链接</h2>
                    <ul>
                        <a href="http://www.yangqq.com">杨青个人博客</a> <a href="http://www.yangqq.com">杨青博客</a>
                    </ul>
                </div>
                <div class="guanzhu">
                    <h2>关注我 么么哒</h2>
                    <ul>
                        <img src="/static/images/wx.jpg">
                    </ul>
                </div>
            </div>
        </aside>
        <div class="r_box">
            {% for aricle in articles %}

                <li><i>
{#                    <a href="/detail?id={{ aricle.id }}">#}
                    <a href="{% url 'xiangqing' %}?id={{ aricle.id }}">

                        <img src="/static/{{ aricle.img }}"></a></i>

                    <h3><a href="{% url 'xiangqing' %}?id={{ aricle.id }}">{{ aricle.title }}</a></h3>
{#                        <p>{{ aricle.desc }}</p>#}
                    <p>{{ aricle.desc | abc:5 }}</p>
{#                    <p>{% abc2 ricle.desc 20  %}</p>#}
                </li>

            {% endfor %}

            {% if articles.has_other_pages %}

            <div class="pagelist">
                {% if articles.has_previous %}
                <a  href="/index?page={{ articles.previous_page_number }}&limit=10" ><b>上一页</b></a>&nbsp;&nbsp;
                    {% endif %}


                {% for page_num in articles.paginator.page_range %}

                <a href="/index?page={{ page_num }}&limit=10" >{{ page_num }}</a>&nbsp;&nbsp;

                {% endfor %}

                {% if articles.has_next %}
                <a href="/index?page={{ articles.next_page_number }}&limit=10">下一页</a>

                    {% endif %}
            </div>
        {% endif %}

        </div>
    </article>

{% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

分页后端实现
paginator

from django.core.paginator import Paginator
from . import const

def index(request):
    category_id = request.GET.get('category_id',1) #?category_id=xx
    page = request.GET.get('page',1)
    limit = request.GET.get('limit',const.page_size)
    article = Article.objects.filter(is_delete=False,category_id=category_id)
    page_obj = Paginator(article,limit)
    page_data = page_obj.page(page)
    data = {'articles':page_data}
    return render(request,'index.html',data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 建立一个const.py,配置默认分页数量
page_size = 10 #默认分页数量
  • 1

分页前端实现


            {% if articles.has_other_pages %}

            <div class="pagelist">
                {% if articles.has_previous %}
                <a  href="/index?page={{ articles.previous_page_number }}&limit=10" ><b>上一页</b></a>&nbsp;&nbsp;
                    {% endif %}


                {% for page_num in articles.paginator.page_range %}

                <a href="/index?page={{ page_num }}&limit=10" >{{ page_num }}</a>&nbsp;&nbsp;

                {% endfor %}

                {% if articles.has_next %}
                <a href="/index?page={{ articles.next_page_number }}&limit=10">下一页</a>

                    {% endif %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 分页常用
from django.core.paginator import Paginator

page_obj = Paginator(Article.objects.all(),2)
print(list(page_obj.page(1)))

print(page_obj.page(1)) #取某一页的数据
print(page_obj.count) #总共多少条
print(page_obj.num_pages) #总共分了多少页

print(page_obj.page_range) #分页的范围

cur_page = page_obj.page(1)

print(cur_page.has_previous()) #判断是否有上一页
# print(cur_page.previous_page_number())
print(cur_page.has_next())#判断是否有下一页
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

丰富django admin
优化自带的

  • pip install simpleui,安装此模板
  • sitting.py里面增加此模板
INSTALLED_APPS = [
    'simpleui',
  • 1
  • 2
  • admin.py丰富功能
from django.contrib import admin

# Register your models here.
from . import models

class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'category', 'create_time', 'update_time'] #显示哪些字段
    search_fields = ['title'] #哪写字段可以搜索,不要写外键的字段
    list_filter = ['category','is_delete']
    list_per_page = 10 #每页显示多少条


class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'create_time', 'update_time'] #显示哪些字段
    search_fields = ['name'] #哪写字段可以搜索,不要写外键的字段
    list_filter = ['is_delete']
    list_per_page = 10 #每页显示多少条



admin.site.register(models.Category,CategoryAdmin)
admin.site.register(models.Article,ArticleAdmin)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

解决跨域问题

pip install django-cors-headers
  • 1

前端自定义标签
templatetags包-my_tag.py

from django import template

register = template.Library()

@register.filter #最多就2个参数
def abc(s,length=10):
    if len(s)>length:
        s = s[:11]+'....'
    return s

@register.simple_tag
def abc2(s,length=10):
    if len(s)>length:
        s = s[:11]+'....'
    return s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • index.html
{% load my_tag %}

  • 1
  • 2
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号