Подавить «Нет» в Jinja2 в TurboGears, используя Environment.finalize

Я интегрировал Jinja2 в TurboGears 2.3.12 и в моем файле шаблона я использовал следующий код

<input type='text' value='{{ obj.attr }}' />

Я получил Нет в текстовом поле, так как объект был новым. Я хочу удалить None в пустую строку. Нашел следующие решения 1.

<input type='text' value='{{ obj.attr or '' }}' />

и 2. https://stackoverflow.com/a/17661969/2102143

Я хочу интегрировать второе решение в TurboGears, так как оно будет доступно для всего приложения, а также позволит избежать или ''


person 5r33naDh    schedule 18.09.2018    source источник
comment
Можете ли вы опубликовать свою конфигурацию jinja2 - turbogears?   -  person fayaz    schedule 18.09.2018
comment
@fayaz base_config.renderers.append('jinja')   -  person 5r33naDh    schedule 18.09.2018
comment
@fayaz @expose('jinja:phb.modules.consultants.templates.setup.staff') def staff(self):   -  person 5r33naDh    schedule 18.09.2018
comment
Вам нужно будет найти какой-нибудь хук в TG, который позволит вам добавить кастомный Jinja2 Enviornment.   -  person fayaz    schedule 18.09.2018
comment
@fayaz Верно. Я пытаюсь это сделать. Кажется, мне нужно переопределить метод, созданный в классе JinjaRenderer в jinja.py github.com/TurboGears/tg2/blob/development/tg/renderers/   -  person 5r33naDh    schedule 18.09.2018
comment
@fayaz Решено переопределением метода   -  person 5r33naDh    schedule 18.09.2018


Ответы (1)


Я переопределил метод класса «создать» tg.renderers.jinja.JinjaRenderer.

config/Jinja.py

try:
    import jinja2
except ImportError:  # pragma: no cover
    jinja2 = None

if jinja2 is not None:
    from jinja2.loaders import FileSystemLoader
    from jinja2 import ChoiceLoader, Environment
    from jinja2.filters import FILTERS
    from jinja2.exceptions import TemplateNotFound
else:  # pragma: no cover
    class FileSystemLoader(object):
        pass

from tg.renderers.base import RendererFactory
from tg.renderers.jinja import JinjaRenderer as jr
from tg.renderers.jinja import DottedTemplateLoader
from tg.i18n import ugettext, ungettext

class JinjaRenderer(jr):
    @classmethod
    def create(cls, config, app_globals):
        """Setup a renderer and loader for Jinja2 templates."""
        if jinja2 is None:  # pragma: no cover
            return None

        if config.get('use_dotted_templatenames', True):
            TemplateLoader = DottedTemplateLoader
            template_loader_args = {'dotted_finder': app_globals.dotted_filename_finder}
        else:
            TemplateLoader = FileSystemLoader
            template_loader_args = {}

        if not 'jinja_extensions' in config:
            config['jinja_extensions'] = []

        # Add i18n extension by default
        if not "jinja2.ext.i18n" in config['jinja_extensions']:
            config['jinja_extensions'].append("jinja2.ext.i18n")

        if not 'jinja_filters' in config:
            config['jinja_filters'] = {}

        loader = ChoiceLoader(
            [TemplateLoader(path, **template_loader_args) for path in config['paths']['templates']])

        def my_finalize(thing):
            return thing if thing is not None else ''

        jinja2_env = Environment(loader=loader, autoescape=True, finalize=my_finalize,
                                 auto_reload=config['auto_reload_templates'],
                                 extensions=config['jinja_extensions'])

        # Try to load custom filters module under app_package.lib.templatetools
        try:
            if not config['package_name']:
                raise AttributeError()

            filter_package = config['package_name'] + ".lib.templatetools"
            autoload_lib = __import__(filter_package, {}, {}, ['jinja_filters'])
            try:
                autoload_filters = dict(
                    map(lambda x: (x, autoload_lib.jinja_filters.__dict__[x]),
                        autoload_lib.jinja_filters.__all__)
                )
            except AttributeError:  # pragma: no cover
                autoload_filters = dict(
                    filter(lambda x: callable(x[1]),
                           autoload_lib.jinja_filters.__dict__.iteritems())
                )
        except (ImportError, AttributeError):
            autoload_filters = {}

        # Add jinja filters
        filters = dict(FILTERS, **autoload_filters)
        filters.update(config['jinja_filters'])
        jinja2_env.filters = filters

        # Jinja's unable to request c's attributes without strict_c
        config['tg.strict_tmpl_context'] = True

        # Add gettext functions to the jinja environment
        jinja2_env.install_gettext_callables(ugettext, ungettext)

        return {'jinja': cls(jinja2_env)}

Затем в config/app_cfg.py

from Jinja import JinjaRenderer
base_config.register_rendering_engine(JinjaRenderer)

Измененный код

def my_finalize(thing):
            return thing if thing is not None else ''

jinja2_env = Environment(loader=loader, autoescape=True, finalize=my_finalize,
                                 auto_reload=config['auto_reload_templates'],
                                 extensions=config['jinja_extensions'])
person 5r33naDh    schedule 18.09.2018