Как добавить несколько аргументов в мой пользовательский шаблонный шаблон в шаблоне django? - PullRequest
75 голосов
/ 07 января 2009

Вот мой пользовательский фильтр:

from django import template

register = template.Library()

@register.filter
def replace(value, cherche, remplacement):
    return value.replace(cherche, remplacement)

и вот как я пытался использовать его в файле шаблона, что привело к ошибке:

{{ attr.name|replace:"_"," " }}
{{ attr.name|replace:"_" " " }}
{{ attr.name|replace:"_":" " }}
{{ attr.name|replace:"cherche='_', remplacement=' '" }}

Я изучил документы Джанго и book , но нашел только пример, использующий один аргумент ... это вообще возможно?

Ответы [ 8 ]

97 голосов
/ 08 января 2009

Это возможно и довольно просто.

Django допускает только один аргумент для вашего фильтра, но нет никаких причин, по которым вы не можете поместить все свои аргументы в одну строку, используя запятую для их разделения.

Так, например, если вам нужен фильтр, который проверяет, есть ли переменная X в списке [1,2,3,4], вам нужен фильтр шаблона, который выглядит следующим образом:

{% if X|is_in:"1,2,3,4" %}

Теперь мы можем создать ваш тег шаблона следующим образом:

from django.template import Library

register = Library()

def is_in(var, args):
    if args is None:
        return False
    arg_list = [arg.strip() for arg in args.split(',')]
    return var in arg_list

register.filter(is_in)

Строка, которая создает arg_list, является выражением генератора, которое разбивает строку args на все запятые и вызывает .strip (), чтобы удалить все начальные и конечные пробелы.

Если, например, 3-й аргумент является int, просто выполните:

arg_list[2] = int(arg_list[2])

Или, если все они целые, сделайте:

arg_list = [int(arg) for arg in args.split(',')]

РЕДАКТИРОВАТЬ: теперь, чтобы конкретно ответить на ваш вопрос, используя пары ключ-значение в качестве параметров, вы можете использовать тот же класс, который Django использует для анализа строк запроса из URL-адресов, что также дает преимущество в правильной обработке кодировки символов согласно settings.py.

Таким образом, как и в случае строк запроса, каждый параметр отделяется знаком '&':

{{ attr.name|replace:"cherche=_&remplacement= " }}

Тогда ваша функция замены теперь будет выглядеть так:

from django import template
from django.http import QueryDict

register = template.Library()

@register.filter
def replace(value, args):
    qs = QueryDict(args)
    if qs.has_key('cherche') and qs.has_key('remplacement'):
        return value.replace(qs['cherche'], qs['remplacement'])
    else:
        return value

Вы могли бы ускорить это, рискуя сделать некоторые неправильные замены:

qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
16 голосов
/ 07 января 2009

Невозможно в соответствии с этим разделом документов:

Пользовательские фильтры - это просто функции Python, которые принимают один или два аргумента:

  • Значение переменной (входной) - не обязательно строка
  • Значение аргумента - это может иметь значение по умолчанию или не указывать.
10 голосов
/ 24 января 2014

Вместо фильтра зарегистрируйте свой тег как простой тег. Те могут принять несколько аргументов. Синтаксис для его вызова будет немного другим, но это просто изменение синтаксического сахара.

9 голосов
/ 25 июня 2014

Это так просто.

@register.filter(name='one_more')
def one_more(_1, _2):
    return _1, _2

def your_filter(_1_2, _3)
    _1, _2 = _1_2
    print "now you have three arguments, enjoy"

{{ _1|one_more:_2|your_filter:_3 }}
4 голосов
/ 07 января 2009

Эта функция была помечена как WONTFIX в Trac Django 2013: http://code.djangoproject.com/ticket/1199

2 голосов
/ 08 апреля 2010

<мой сайт> /globaltags/replace.py

from django.template import Library

import re

register = Library()

def search(value, search):
    return re.sub(search, '#f4x@SgXXmS', value)

def replace(value, replace):
    return re.sub('#f4x@SgXXmS', replace, value)

register.filter(search)
register.filter(replace)

В шаблоне:

{{ "saniel"|search:"s"|replace:"d" }}
0 голосов
/ 28 сентября 2018

Вы можете просто сделать это:

{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}

public static List<object> Find(object collection, string column, string value)

И он достигнет пункта назначения, поскольку абстракция функции равна sjare.

0 голосов
/ 13 марта 2009

Вот плохая идея, но работает:

{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}

и

@register.filter
def input_by_xpath(device, args): 
    args = eval(args)
    ...
    result = "<input type=\"%s\" value=\"%s\" name=\"%s\"/>"%(args['type'],value,args['xpath'])
    return mark_safe(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...