เป็นไปได้และค่อนข้างง่าย
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 ให้ทำ:
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',''))