2011-11-29 34 views
26

Tôi có trường mô hình, lưu trữ danh sách các URL (vâng, tôi biết, đó là cách sai) là url1\nurl2\nurl3<...>. Tôi cần phải chia lĩnh vực này thành một mảng trong mẫu của tôi, vì vậy tôi tạo ra các bộ lọc tùy chỉnh:Mẫu Django - chia chuỗi thành mảng

@register.filter(name='split') 
def split(value, arg): 
    return value.split(arg) 

tôi sử dụng nó theo cách này:

{% with game.screenshots|split:"\n" as screens %} 
     {% for screen in screens %} 
      {{ screen }}<br> 
     {% endfor %} 
    {% endwith %} 

nhưng như tôi có thể nhìn thấy, phân chia không muốn làm việc: Tôi nhận được đầu ra như url1 url2 url3 (với các ngắt dòng nếu tôi nhìn vào nguồn). Tại sao?

Trả lời

52

Django cố ý lá ra nhiều loại templatetags để ngăn cản bạn làm quá nhiều xử lý trong mẫu. (Thật không may, mọi người thường chỉ thêm những loại templatetags này.)

Đây là ví dụ hoàn hảo về một thứ gì đó phải có trong mẫu không phải mẫu của bạn.

class Game(models.Model): 
    ... 
    def screenshots_as_list(self): 
     return self.screenshots.split('\n') 

Sau đó, trong mẫu của bạn, bạn chỉ cần làm:

{% for screen in game.screenshots_as_list %} 
    {{ screen }}<br> 
{% endfor %} 

Nhiều hơn nữa rõ ràng và dễ dàng hơn để làm việc với.

+0

Điều này có ý nghĩa hơn nhiều. Bạn đã cứu tôi từ nhiều điều sai. –

+3

Hãy nhớ rằng, các mô hình quá béo có thể trở thành một đống công cụ không thể duy trì. Trường hợp cụ thể này là hợp lệ - bạn sẽ chuyển đổi một số dữ liệu được tuần tự hóa sang Python, điều này có ý nghĩa khi thực hiện trên lớp mô hình. (Bạn thậm chí có thể làm cho phương thức đó là một thuộc tính được tính toán.) Tuy nhiên, nếu bạn muốn đặt một phương thức trên mô hình của bạn * chỉ * để bạn có thể gọi nó từ mẫu của bạn, hãy suy nghĩ hai lần - có lẽ sẽ ổn thôi xử lý trong (các) chế độ xem của bạn :) – Tony

+0

tốt hơn thẻ mẫu nếu nội dung từ mô hình.Model – WeizhongTu

3

Hm, tôi đã giải quyết được vấn đề này một phần. Tôi đã thay đổi bộ lọc của mình thành:

@register.filter(name='split') 
def split(value, arg): 
    return value.split('\n') 

Tại sao nó không hoạt động với mã gốc?

+0

Có lẽ bạn cần thiết để thoát \ n? – jooks

+0

Nhưng bạn đặt đoạn mã này ở đâu? views.py? –

Các vấn đề liên quan