改进模板标签的功能 - Django

Posted

技术标签:

【中文标题】改进模板标签的功能 - Django【英文标题】:Improve the function of a template tag - Django 【发布时间】:2020-04-16 08:29:55 【问题描述】:

我正在编写一个星级评分系统,以图形方式计算课程的星级,我使用了以下模板标签:

@register.simple_tag
def get_course_rating(course):
    decimal, integer = math.modf(course.get_average_rating())

    rating_stars = 
        'stars': range(int(integer))
    

    if decimal > 0:
        rating_stars['star_half_empty'] = True
        rating_stars['stars_empty'] = range((5 - int(integer)) - 1)
    else:
        rating_stars['star_half_empty'] = False
        rating_stars['stars_empty'] = range(5 - int(integer))

    return rating_stars

通过这种方式,我将星级评分放在 html 中:

% load course_tags %
% get_course_rating course as rating %

% for i in rating.stars %
    <i class="icon-star"></i>
% endfor %

% if rating.star_half_empty %
    <i class="icon-star-half-alt"></i>
% endif %

% for i in rating.stars_empty %
    <i class="icon-star-empty"></i>
% endfor %

我觉得这样做很乏味,所以我想知道是否有办法改进它? 在 HTML 的意义上。

我使用这个 html 代码大约 3 次,对我来说这是重复的代码,我不希望这样......

我突然想到模板标签返回 html 代码,但我不确定这是否是好的做法......

还有更专业的解决方案吗?这对我的学习有很大帮助...

【问题讨论】:

您可以将此星标 html 作为单独的模板,并通过include 重复使用它。或者把它做成单独的inclusion_tag 最好的解决方案是包含标签!谢谢!! 【参考方案1】:

您可以将此"start rating html" 作为单独的模板并将其与自定义inclusion tag 一起使用

另一个不太动态的选项 - 在模板中重复使用include

区别nicely described here。

【讨论】:

将文件保存在以下路径中:courses/snippets/rating_stars.html。你怎么看? 这个html是模板,所以它应该去templates目录(你选择的子目录)。标签定义 - 在templatetags. 我忘了放完整的路线,这里是:courses/templates/courses/snippets/rating_stars.html。就这样好吗?你怎么看? 是的,没关系。目录布局更多的是个人品味,应该对您有意义。即,我更喜欢具有多个应用程序的 django 项目 - 一个通用模板目录(因为这些模板定义了我的网站的外观)(带有应用程序的子目录),因此应用程序目录中没有模板。但是,在这种情况下 - 模板是模板标签的一部分,不应该直接使用。模板标签在某些应用程序中。所以,这个模板需要在这个app dir/templates dir中,而不是在common templates dir中。 简而言之,这个模板必须在应用程序的“templates”目录下,模板标签在哪里,对吧?

以上是关于改进模板标签的功能 - Django的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义模板标签不返回任何值

Django内置模板标签

08 Django 模板进阶

Django模板进阶007

Django自定义simple_tag和filter

Django之Django模板自定义过滤器