2019.3.14【【Django2.0教程】27.获取评论数和细节处理

  • 1 今天,在旅馆遇到了一个学JAVA的兄弟,发现了一个很严重的问题,实际上很多公司的招聘要求,他们自己都不太清楚。他们不是很包容新的程序猿,他们只想要有经验,有项目经历的程序猿,最后导致互相欺骗的,大家都说服不了大家。

先把今天的代码更改发上来,这些代码是对上一节代码的优化,并没有实质性的修改。
GITHUB:https://github.com/HaddyYang/django2.0-course/tree/master/26.回复功能设计和树结构

from django import template
from django.contrib.contenttypes.models import ContentType
from ..models import Comment
from ..forms import CommentForm


register = template.Library()

@register.simple_tag
def get_comment_count(obj):
    content_type = ContentType.objects.get_for_model(obj)
    return Comment.objects.filter(content_type=content_type, object_id=obj.pk).count()

@register.simple_tag
def get_comment_form(obj):
    content_type = ContentType.objects.get_for_model(obj)
    form = CommentForm(initial={
            'content_type': content_type.model, 
            'object_id': obj.pk, 
            'reply_comment_id': 0})
    return form

@register.simple_tag
def get_comment_list(obj):
    content_type = ContentType.objects.get_for_model(obj)
    comments = Comment.objects.filter(content_type=content_type, object_id=obj.pk, parent=None)
    return comments.order_by('-comment_time')

使用方法:
简单标签¶
django.template.Library.simple_tag()¶
许多模板标签采用了许多参数 - 字符串或模板变量 - 并在完全基于输入参数和一些外部信息进行一些处理后返回结果。例如, current_time标记可能接受格式字符串,并将时间作为相应格式化的字符串返回。

为了简化这些类型标记的创建,Django提供了一个辅助函数 simple_tag。该函数是一种方法 django.template.Library,它接受一个接受任意数量参数的函数,将它包装在render函数中,并将上面提到的其他必要位包装在模板系统中。

current_time因此,我们的函数可以这样写:

import datetime
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
    return datetime.datetime.now().strftime(format_string)
有关simple_tag辅助函数的一些注意事项:

在调用函数时已经检查了所需的参数数量等,因此我们不需要这样做。
参数周围的引号(如果有的话)已被剥离,所以我们只收到一个普通的字符串。
如果参数是模板变量,我们的函数将传递变量的当前值,而不是变量本身。
与其他标记实用程序不同,如果模板上下文处于自动调用模式,则simple_tag传递其输出 conditional_escape(),以确保正确的HTML并保护您免受XSS漏洞的影响。

如果不需要额外的转义,mark_safe()如果您完全确定您的代码不包含XSS漏洞,则需要使用 。对于构建小型HTML代码段,强烈建议使用format_html()代替mark_safe()。

如果模板标记需要访问当前上下文,则可以takes_context在注册标记时使用该 参数:

@register.simple_tag(takes_context=True)
def current_time(context, format_string):
    timezone = context['timezone']
    return your_get_current_time_method(timezone, format_string)

请注意,必须调用第一个参数context。

有关该takes_context选项如何工作的更多信息,请参阅有关包含标记的部分。

如果您需要重命名标记,可以为其提供自定义名称:

register.simple_tag(lambda x: x - 1, name='minusone')

@register.simple_tag(name='minustwo')
def some_function(value):
    return value - 2
simple_tag函数可以接受任意数量的位置或关键字参数。例如:

@register.simple_tag
def my_tag(a, b, *args, **kwargs):
    warning = kwargs['warning']
    profile = kwargs['profile']
...
return ...

然后在模板中,可以将由空格分隔的任意数量的参数传递给模板标记。与在Python中一样,关键字参数的值使用等号(“ =”)设置,并且必须在位置参数之后提供。例如:

{% my_tag 123 “abcd” book.title warning=message|lower profile=user.profile %}
可以将标记结果存储在模板变量中,而不是直接输出它。这是通过使用as参数后跟变量名来完成的。这样做可以让您在自己认为合适的地方输出内容:

{% current_time “%Y-%m-%d %I:%M %p” as the_time %}

The time is {{ the_time }}.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值