美文网首页python大法攻略
Django项目(四、前端技巧)

Django项目(四、前端技巧)

作者: 眼君 | 来源:发表于2020-09-10 10:02 被阅读0次

    模版的继承

    为了使得Django的前端html代码可以复用, Django允许以模版形式使得html之间可以继承。

    #base.html
    {% block XX %}{% endblock %}
    
    
    
    #index.html
    {% extend 'base.html' %}
    
    {% block XX %}
        atom
    {% endblock %}
    

    显示media

    如果我们需要在前端显示models中的image, 我们需要一些不同于staticfiles的配置。
    首先,需要在配置文件中做一些设置:

    #settings.py
    ...
    #绝对路径中的文件夹
    MEDIA_URL = '/media/'
    #media文件夹的绝对路径
    MEDIA_ROOT = os.path.join(BASE_DIR,"media")
    ...
    

    前端显示models的URL:

    #xxx.html
    
    ...
    src = "{{ MEDIA_URL }}{{ xxx.image }}"
    ...
    

    最后, urls.py中还要一些配置:

    #urls.py
    
    from django.views.static import serve
    from .settings import MEDIA_ROOT
    
    ...
    urlpatterns = [
        ...
        url(r'^media/(?P<path>.*)$',serve,{"document_root":MEDIA_ROOT})
    ]
    ...
    
    分页器

    首先, 下载开源的分页组件:

    pip3 install django-pure-pagination
    

    接下来, 在settings.py中进行配置:

    #settings.py
    ...
    INSTALL_APPS = [
        ...
        "pure_pagination",
    ]
    
    PAGINATION_SETTINGS = {
        #一共多少页码标签
        'PAGE_RANGE_DISPLAYED':10,
        'MARGIN_PAGES_DISPLAYED':2,
        'SHOW_FIRST_PAGE_WHEN_INVALID':True
    }
    

    接下来, 在views.py中编写分页:

    #settings.py
    ...
    from pure_pagination import Paginator,PageNotAnInteger
    
    ...
    #文章目录
    def articleCatalog(request):
        #tag_list = set([one.category for one in Article.objects.all()])
        tag_list = ArticleTag.objects.all()
        querytag = request.GET.get('tag')
        if querytag:
            article_list = Article.objects.filter(category = querytag)
            querytag = int(querytag)
        else:
            article_list = Article.objects.all()
        #分页器
        try:
            page_num = request.GET.get('page_num', 1)
        except PageNotAnInteger:
            page_num = 1
    
        page_robot = Paginator(article_list,20,request=request)
        article_list = page_robot.page(page_num)
    
        return render(request,'articleCatalog.html',{'page':'articles','article_list':article_list,'article_tag':querytag,'tag_list':tag_list})
    

    接下来注意, 前端代码中取article_list的时候, 不能直接对article_list进行迭代, 而要对article_list.object_list进行迭代:

    #xxx.html
    ...
    {% for one in article_list.object_list %}
        <tr>
          <td>
            <h5 class="ui left aligned header">
              <a href="{% url 'articleDetail' one.id %}">{{ one.title }}</a>
            </h5>
          </td>
          <td class="ui center aligned single line">{{ one.category }}</td>
          <td class="ui center aligned single line">{{ one.pub_date }}</td>
          <td class="ui center aligned single line">{{ one.update_time }}</td>
          <td class="ui center aligned single line">{{ one.read_num }}</td>
        </tr>
    {% endfor %}
    ...
    
    <div class="ui right floated pagination menu">
      {% if article_list.has_previous %}
          <a href="?page_num={{ article_list.previous_page_number }}{% if tag %}&tag={{ tag }}{% endif %}" class="item">上一页</a>
      {% endif %}
    
      {% for page in article_list.pages %}
        {% if page %}
          {% ifequal page article_list.number %}
              <a class="disabled item">{{ page }}</a>
          {% else %}
              <a href="?page_num={{ page }}{% if tag %}&tag={{ tag }}{% endif %}" class="item">{{ page }}</a>
          {% endifequal %}
        {% else %}
          <span class="item">...</span>
        {% endif %}
      {% endfor %}
    
      {% if article_list.has_next %}
          <a href="?page_num={{ article_list.next_page_number }}{% if tag %}&tag={{ tag }}{% endif %}" class="item">下一页</a>
      {% endif %}
    </div>
    

    面包屑导航

    #xxx.html
    ...
    {% block custom_bread %}
    <section>
        <div class="wp">
            <ul  class="crumbs">
                <li><a href="/">首页</a>></li>
            </ul>
        </div>
    </section>
    {% endblock %}
    

    全局搜素

    全局搜索通过用户给出的关键字匹配出对应的数据:

    #articles/views.py
    ...
    class ArticleCatalogView(View):
        def get(self,request):
            tag_list = ArticleTag.objects.all()
            querytag = request.GET.get('article_tag','')
    
            if querytag:
                article_list = Article.objects.filter(category = querytag)
                querytag = int(querytag)
            else:
                article_list = Article.objects.all()
    
            search_keywords = request.GET.get('keywords', '')
            if search_keywords:
                article_list = article_list.filter(title__icontains=search_keywords)
    
            #分页器
            try:
                page_num = request.GET.get('page_num', 1)
            except PageNotAnInteger:
                page_num = 1
    
            page_robot = Paginator(article_list,20,request=request)
            article_list = page_robot.page(page_num)
    
            return render(request,'articleCatalog.html',{'page':'articles','article_list':article_list,'article_tag':querytag,'tag_list':tag_list})
    

    相关文章

      网友评论

        本文标题:Django项目(四、前端技巧)

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