Nó có thể và khá đơn giản.
Django chỉ cho phép một đối số vào bộ lọc của bạn, nhưng không có lý do gì bạn không thể đặt tất cả các đối số của mình vào một chuỗi duy nhất bằng cách sử dụng dấu phẩy để phân tách chúng.
Vì vậy, ví dụ: nếu bạn muốn một bộ lọc kiểm tra xem biến X có trong danh sách [1,2,3,4] hay không, bạn sẽ muốn một bộ lọc mẫu giống như sau:
{% if X|is_in:"1,2,3,4" %}
Bây giờ chúng tôi có thể tạo thẻ tạm thời của bạn như sau:
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)
Dòng tạo arg_list là một biểu thức trình tạo chia chuỗi args trên tất cả các dấu phẩy và gọi .strip () để loại bỏ bất kỳ khoảng trắng đầu và cuối nào.
Ví dụ: nếu đối số thứ 3 là int thì chỉ cần làm:
arg_list[2] = int(arg_list[2])
Hoặc nếu tất cả chúng đều là int thì:
arg_list = [int(arg) for arg in args.split(',')]
CHỈNH SỬA: bây giờ để trả lời cụ thể câu hỏi của bạn bằng cách sử dụng các cặp khóa, giá trị làm tham số, bạn có thể sử dụng cùng một lớp mà Django sử dụng để phân tích cú pháp các chuỗi truy vấn ra khỏi URL, sau đó cũng có lợi ích là xử lý mã hóa ký tự đúng theo settings.py .
Vì vậy, như với các chuỗi truy vấn, mỗi tham số được phân tách bằng '&':
{{ attr.name|replace:"cherche=_&remplacement= " }}
Sau đó, hàm thay thế của bạn bây giờ sẽ giống như sau:
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
Bạn có thể đẩy nhanh quá trình này một số có nguy cơ thực hiện một số thay thế không chính xác:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))