Django将模型数据发送到页眉和页脚的更好方法

ecbunoof  于 2022-12-14  发布在  Go
关注(0)|答案(3)|浏览(121)

在Django中,我们为页眉和页脚创建了模板,以减少代码重复。但是当页眉和页脚的内容是动态的时,对于每个视图,我们需要查询内容并传递上下文,如下所示:

from django.shortcuts import render
from models import HeaderModel, FooterModel

def home(request):
    #views code here:

    #get latest news    
    header_content = HeaderModel.objects.all()
    footer_content = FooterModel.objects.all()

    #info to pass into the html template
    context = {
        'header_content': header_content,
        'footer_content': footer_content,
    }

    return render(request,'home.html',context)

def login(request):
    #views code here:

    #get latest news    
    header_content = HeaderModel.objects.all()
    footer_content = FooterModel.objects.all()

    #info to pass into the html template
    context = {
        'header_content': header_content,
        'footer_content': footer_content,
    }

    return render(request,'login.html',context)

在我的方法中,我发现对于每个页面,我都需要重复地编写页眉和页脚内容的代码,并传递到上下文中。有没有更好的方法来做到这一点,从而没有重复?

oxf4rvwz

oxf4rvwz1#

我们可以使用上下文处理器来解决这些问题。
上下文处理器对于在模板中构建动态模型数据非常有用。
我们通过写函数来创建它们。我们可以在一个名为context_processors. py的文件中写尽可能多的函数。这个文件可以在一个名为context_processors的文件夹中。这个文件夹可以在general project文件夹中。文件和文件夹的名称可以是任何你想要的。把“init.py”文件放在这个文件夹中,为了知道这是一个Django包。作为一个例子,我将在两个页脚类型中返回当前年份(这不是一个数据模型)和一些帖子(这是一个数据模型)作为上下文:

context_processors (folder)
 -> __init__.py
 -> context_processors.py

然后,在www.example.com文件的TEMPLATE变量中注册此上下文处理器settings.py:

'OPTIONS': {
   'context_processors': [
       ...
       'context_processors.context_processors.current_year_context_processor',
       'context_processors.context_processors.posts_view_context_processor',
   ],
},

在context_processors.py文件中写入函数:

import datetime

from blog.models import Post

# For _footer_bottom.html template file
def current_year_context_processor(request):
    current_datetime = datetime.datetime.now()
    return {
        'current_year': current_datetime.year
    }

# For _footer.html template file
def posts_context_processor(request):
    posts = Post.objects.order_by('-updated')  # By updated date.

    return {
        'posts': posts
    }

最后,将其放入您喜欢的HTML页脚模板中:
页脚1(_页脚. html):

<ul ...>

{% if posts %}
    {% for p_record in posts|slice:":3" %}
        <li>
            <div class="footer-widget__news_image">
                <img src="{{ p_record.image_main.url }}" alt="">
            </div>
            <div class="footer-widget__news_text">
                <p><a href="{% url 'post' p_record.slug %}"> {{ p_record.title | truncatechars:45 }}</a></p>
            </div>
            <div class="footer-widget__news_date_box">
                <p>{{ p_record.updated | date:"SHORT_DATE_FORMAT" }}</p>
            </div>
        </li>
    {% endfor %}
{% else %}

    <p>No hay novedades.</p>

{% endif %}

</ul>

在另一个HTML页脚文件中:
页脚2(_页脚_底部. html):
不要在页脚中使用来获取当前年份:

<p>@ {% now 'Y' %} Business Name. Derechos reservados.</p>

我们可以使用上下文处理器,直接将上下文放入模板中:

<p>@ {{ current_year }} Business Name. Derechos reservados.</p>
zf9nrax1

zf9nrax12#

您可以使用Django中的自定义模板标签并将数据发送到页眉和页脚https://docs.djangoproject.com/en/4.0/howto/custom-template-tags/
同样,你可以使用上下文处理器,但是上下文处理器发送数据到所有的模板文件,对于大数据来说,这不是一个好方法。

iqxoj9l9

iqxoj9l93#

首先为页脚和页眉编写一个不同的模板文件,如footer.html和header.html,然后可以在要继承页脚和页眉的文件中使用{% include 'template_name' %}。

相关问题