Nano Hash - криптовалюты, майнинг, программирование

Как добавить несколько аргументов в мой пользовательский фильтр шаблона в шаблоне django?

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

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=' '" }}

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


Ответы:


1

Это возможно и достаточно просто.

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])

Или, если все они ints do:

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

РЕДАКТИРОВАТЬ: теперь, чтобы конкретно ответить на ваш вопрос, используя пары ключ, значение в качестве параметров, вы можете использовать тот же класс, который Django использует для анализа строк запроса из URL-адресов, что также имеет преимущество правильной обработки кодировки символов в соответствии с вашими настройками.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',''))
08.01.2009
  • Если значения для них находятся в переменных, как это реализовать...? 13.11.2013
  • Это казалось полезным, но я не мог заставить его работать с передаваемыми переменными. Для этого я использовал tag или simple_tag, что позволяет передавать несколько переменных, даже именованные переменные. 13.01.2015
  • Я далек от будущего, но мне кажется, что тег был бы лучшим решением, чем по сути писать парсер в фильтре. 25.03.2021

  • 2

    Это просто.

    @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 }}
    
    25.06.2014
  • Действительно большое спасибо за это решение. Я немного обновил его, чтобы вы могли связывать параметры разной длины. gist.github.com/BrnoPCmaniak/e9552294b3059461f940a47143f58811 04.04.2017
  • Это должен быть правильный ответ! Это красивое решение для python (возможно, не лучшее решение для django, см. ответ @dragonroot) 10.02.2020

  • 3

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

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

    • Значение переменной (ввод) -- не обязательно строка.
    • Значение аргумента -- может иметь значение по умолчанию или вообще быть опущено.
    07.01.2009
  • Подход Ван Гейла будет работать, если вы используете жестко закодированные строки. Билет Django [code.djangoproject.com/ticket/1199] поддерживает несколько аргументов в пользовательском фильтр и патч был принят. 02.10.2011

  • 4

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

    24.01.2014
  • Это был правильный ответ на мою проблему. Чтобы передать переменную шаблона в эту функцию, мне пришлось использовать simple_tag. 13.01.2015
  • Это хорошее решение. Определенно стоит проверить документы django для простого тега: docs.djangoproject.com/en/1.8/howto/custom-template-tags/ 09.10.2015
  • Это то, что имеет для меня наибольший смысл. Теги являются более мощными и сложными, чем фильтры, поэтому, если ваша проблема более сложна, кажется, что это лучший подход, чем попытка вставить квадратный колышек в круглое отверстие. 25.03.2021

  • 5

    Это проще, чем вы думаете

    Для этого можно использовать simple_tag.

    from django import template
    register = template.Library()
    
    @register.simple_tag
    def multiple_args_tag(a, b, c, d):
       #do your stuff
       return 
    

    В шаблоне:

    {% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}
    

    ПРИМЕЧАНИЕ. Не забудьте перезапустить сервер.

    07.04.2020

    6

    ‹мой-сайт›/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" }}
    
    08.04.2010
  • Было бы неплохо, если бы вы объяснили #f4x@SgXXmS немного? 11.10.2011
  • просто случайная строка, используемая в качестве заполнителя. Я выбрал эту строку, потому что считал, что она не будет частью входной строки. Если, например, я использовал {} вместо '#f4x@SgXXmS', {{ use {} вместо off []|search:off|replace:of }} вернет: использование вместо [] а не ожидаемый результат : используйте {} вместо [] 16.10.2011
  • О, это имеет смысл. Было бы неплохо объявить это SUBSTRING_THAT_NEVER_OCCURS мыслью. 16.10.2011


  • 8

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

    {% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}
    
    public static List<object> Find(object collection, string column, string value)
    

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

    28.09.2018

    9

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

    {{ 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)
    
    13.03.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..