Как я добавляю, что несколько аргументов моему пользовательскому шаблону просачиваются шаблон django?

Скобки, которые вы видите, являются просто автоматическим способом отображения списка в JAVA (например, при использовании System.out.println(list);.

Если вы не хотите, чтобы они отображались при его показе, вы можете создать custom method:

public void showList(List<Integer> listInt)
{
    for(int el : listInt)
    {
        System.out.print(el + ", ");
    }
}

Затем настройте этот код, чтобы показать это по своему вкусу!

81
задан bchhun 7 January 2009 в 15:21
поделиться

5 ответов

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

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

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

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

Теперь мы можем создать Ваш templatetag как это:

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-м аргументом является интервал тогда просто, сделайте:

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

Или если все они - ints, сделайте:

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',''))
101
ответ дан Van Gale 5 November 2019 в 17:22
поделиться

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

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

  • значение переменной (вход) - не обязательно строка.
  • значение аргумента - это может иметь значение по умолчанию или быть не учтено в целом.
17
ответ дан Jeff Bauer 5 November 2019 в 17:22
поделиться

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

4
ответ дан Ciro Santilli 新疆改造中心法轮功六四事件 5 November 2019 в 17:22
поделиться

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

{{ 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)
-2
ответ дан 5 November 2019 в 17:22
поделиться

/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" }}
2
ответ дан 24 November 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: