كيف يمكنني إضافة العديد من الحجج إلى قالب مخصص مرشح في جانغو القالب ؟

StackOverflow https://stackoverflow.com/questions/420703

  •  05-07-2019
  •  | 
  •  

سؤال

هنا هو بلدي تصفية مخصص:

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

نظرت إلى جانغو مستندات و الكتاب ولكن فقط وجدت على سبيل المثال استخدام حجة واحدة...هل من الممكن ؟

هل كانت مفيدة؟

المحلول

ومن الممكن وبسيطة إلى حد ما.

وجانغو يسمح فقط وسيطة واحدة للمرشح، ولكن ليس هناك سبب لا يمكنك وضع كل حججك في سلسلة واحدة باستخدام فاصلة للفصل بينهما.

وهكذا على سبيل المثال، إذا كنت ترغب في تصفية يتحقق إذا المتغير 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 هو تعبير مولد الذي يقسم سلسلة وسائط على جميع الفواصل ويدعو .strip () لإزالة أي المسافات البادئة وزائدة.

إذا، على سبيل المثال، فإن الحجة 3RD هو عدد صحيح ثم القيام فقط:

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

وأو إذا كان كل من هم [إينتس] به:

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

وتحرير: الآن للإجابة على وجه التحديد سؤالك باستخدام المفتاح، أزواج قيمة كمعلمات، يمكنك استخدام نفس الفئة يستخدم جانغو تحليل سلاسل الاستعلام من 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',''))

نصائح أخرى

لا يمكن وفقا هذا القسم من مستندات:

فلاتر مخصصة فقط الثعبان الوظائف التي تتخذ واحدا أو اثنين من الحجج:

  • قيمة المتغير (المدخلات) -- ليس بالضرورة سلسلة.
  • قيمة الوسيطة -- هذا يمكن أن يكون القيمة الافتراضية ، أو تكون مستبعدة تماما.

وبدلا من مرشح، تسجيل العلامة كبصمة بسيطة. هذه يمكن أن تتخذ حجج متعددة. وبناء الجملة من أجل تتذرع بها تكون مختلفة قليلا، ولكن هذا مجرد النحوي تغيير السكر.

من السهل مثل هذا.

@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 }}

لقد تميزت هذه الميزة كما WONTFIX في عام 2013 تراك جانغو: http://code.djangoproject.com / تذكرة / 1199

<my-site>/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" }}

ويمكنك ببساطة قيام بذلك:

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

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

وسيكون وصول إلى الوجهة كما التجريد من وظيفة غير sjare.

وهيريس فكرة سيئة لكنه يعمل:

{{ 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top