Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试Django自定义过滤器?_Python_Django_Django Templates_Django Testing - Fatal编程技术网

Python 如何测试Django自定义过滤器?

Python 如何测试Django自定义过滤器?,python,django,django-templates,django-testing,Python,Django,Django Templates,Django Testing,此问题类似于,但与该示例不同,过滤器实际上是在templatetags目录中的模块中定义的,如中所述。以下是templatetags/label\u with_classes.py中的过滤器代码: from django import template register = template.Library() @register.filter(is_safe=True) def label_with_classes(bound_field): classes = f"{'acti

此问题类似于,但与该示例不同,过滤器实际上是在
templatetags
目录中的模块中定义的,如中所述。以下是
templatetags/label\u with_classes.py
中的过滤器代码:

from django import template

register = template.Library()


@register.filter(is_safe=True)
def label_with_classes(bound_field):
    classes = f"{'active' if bound_field.value() else ''} {'invalid' if bound_field.errors else ''}"
    return bound_field.label_tag(attrs={'class': classes})
这是我第一次尝试测试它:

from ..templatetags.label_with_classes import label_with_classes
from django.test import SimpleTestCase
from django.template import Context, Template


from ..forms.sessions import SessionForm


class CustomFilterTest(SimpleTestCase):
    def test_1(self):
        form = SessionForm(data={})
        self.assertFalse(form.is_valid())
        self.assertEqual(
            form.errors,
            {'session_number': ['This field is required.'],
             'family': ['This field is required.'],
             'session_type': ['This field is required.']})


        template = Template('{{ form.session_number|label_with_classes }}')
        context = Context({'form': form})

        output = template.render(context)
问题是我得到一个错误,没有找到筛选器:

django.template.exceptions.TemplateSyntaxError: Invalid filter: 'label_with_classes'
这是因为测试用例没有模拟注册过滤器并将其加载到模板中的行为。例如,在Django源代码中似乎有一个精心设计的
设置
装饰器,它为测试类提供了一个
self.engine
,其
render_to_string
方法已经安装了所需的过滤器


我基本上必须复制Django源代码才能为自定义过滤器编写集成风格测试吗?或者有没有更简单的方法(除了将其作为功能进行测试之外)?

我怀疑您需要加载模板模块:

...
template = Template("""{% load label_with_classes %}
{{ form.session_number|label_with_classes }}""")
...