2011-01-28 7 views
31


Tôi cố gắng để vượt qua trong các tham số url cho mẫu django như thế này ...Cần để chuyển đổi một chuỗi để int trong một django mẫu

response = render_to_string('persistConTemplate.html', request.GET) 

này dòng gọi từ file views.py tôi. persistConTemplate.html là tên của mẫu của tôi và request.GET là từ điển chứa các tham số url.

Trong mẫu tôi cố gắng sử dụng một trong các thông số như thế này ...

{% for item in (numItems) %} 

    item {{item}} 

{% endfor %} 

số Mục là một trong những thông số url mà tôi đang gửi trong yêu cầu của tôi như thế này ...

http:/someDomain/persistentConTest.html/?numItems=12 

Khi tôi cố gắng cho vòng lặp trên, tôi nhận được một kết quả như thế này ....

image 1 image 2

tôi đang mong đợi và muốn để xem hình ảnh từ được in 12 lần ...

image 1 image 2 image 3 image 4 image 5 image 6 image 7 image 8 image 9 image 10 image 11 image 12

Mọi người có thể vui lòng cho tôi biết tôi đang làm gì không?

+1

Bất kỳ lý do cụ thể nào bạn đang thực hiện việc này trong một mẫu chứ không phải trong chế độ xem? – bernie

+0

Vâng, tôi đã cố gắng để làm theo cách tiếp cận toàn bộ lớp nhưng có lẽ như những người khác đã đề nghị nơi tốt nhất để xử lý này là trong xem. – user479808

Trả lời

5

Vâng, nơi cho điều này là trong giao diện.

Tôi cảm thấy như ví dụ trên sẽ không hoạt động - bạn không thể lặp qua một số nguyên.

numItems = request.GET.get('numItems') 

if numItems: 
    numItems = range(1, int(numItems)+1) 

return direct_to_template(request, "mytemplate.html", {'numItems': numItems}) 


{% for item in numItems %} 
{{ item }} 
{% endfor %} 
+0

Cảm ơn bạn đã trả lời nhưng tôi nhận được kết quả tương tự khi tôi thử theo cách này .... image 1 image 2 – user479808

+0

Bạn có thể đăng mã của mình không? Mã này hoạt động. Tôi nhận thấy một sai lầm nhỏ, nơi tôi đã viết 'phạm vi (1, int (phạm vi) +1)' mà nên được 'phạm vi (1, int (numItems) +1)' (điều này nên đã ném một ngoại lệ nếu bạn đã cố gắng để chạy nó Nếu 'numItems' được chuyển vào GET, hãy tạo danh sách các số nguyên từ 1 đến 'numItems' và lặp lại chúng trong mẫu. –

+0

Không chắc chắn nên đăng nó ở đâu để tôi sẽ sửa bài gốc và thêm vào đó. ... – user479808

2

Bạn nên thêm một số mã vào chế độ xem của mình để giải nén tham số GET và chuyển đổi chúng thành giá trị bạn muốn. Ngay cả khi numItems là một số nguyên, cú pháp bạn đang hiển thị sẽ không cung cấp cho bạn kết quả bạn muốn.

Hãy thử điều này:

ctx = dict(request.GET) 
ctx['numItems'] = int(ctx['numItems']) 
response = render_to_string('persistConTemplate.html', ctx) 
+0

Cảm ơn bạn đã trả lời nhưng tôi nhận được lỗi sau khi tôi thử ... ctx ['numObjects'] = int (ctx ['numObjects']) KeyError: 'numObjects' – user479808

+0

Bỏ dòng đó vào 'if 'numObjects 'in ctx:' –

87

bạn có thể ép buộc một str đến một int sử dụng tiện ích lọc

{% for item in numItems|add:"0" %} 

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#add

để ép buộc int để str chỉ cần sử dụng slugify

{{ some_int|slugify }} 

EDIT: mà nói , Tôi đồng ý với những người khác rằng thông thường bạn nên làm điều này trong quan điểm - sử dụng các thủ thuật này chỉ khi alt ernatives tồi tệ hơn nhiều.

+0

đây là câu trả lời tôi cần - cảm ơn :) – simon

+0

Cảm ơn bạn. Tôi bị đau đầu khi làm việc với các mẫu đơn. Việc bắt được trong lĩnh vực "ngoại khóa".Khi được tải từ biểu mẫu DB " .value" chứa số nguyên. Nhưng sau khi đệ trình "form. .value" là chuỗi .... TADÁ! – darkless

+0

thay vì thực hiện việc hiểu danh sách trên id ... gọn gàng. Quá dễ. – benzkji

14

Tôi thích làm cho một bộ lọc tùy chỉnh:

# templatetags/tag_library.py 

from django import template 

register = template.Library() 

@register.filter() 
def to_int(value): 
    return int(value) 

Cách sử dụng:

{% load tag_library %} 
{{ value|to_int }} 

Đó là đối với trường hợp này không thể dễ dàng thực hiện theo quan điểm.

+3

Đây là cách làm sạch hơn các câu trả lời khác. –

0

Giải pháp của tôi là loại một hack và rất cụ thể ..

Trong mẫu tôi muốn so sánh tỷ lệ với 0.9, và nó không bao giờ đạt 1, nhưng tất cả các giá trị được coi là chuỗi trong các mẫu, và không có cách nào để chuyển đổi chuỗi thành phao.

Vì vậy, tôi đã làm điều này:

{% if "0.9" in value %} 
... 
{% else %} 
... 
{% endif %} 

Nếu tôi muốn phát hiện một số giá trị vượt quá 0.8, tôi phải làm gì:

{% if ("0.9" in value) or ("0.8" in value) %} 
... 
{% else %} 
... 
{% endif %} 

Đây là một hack, nhưng đủ trong trường hợp của tôi. Tôi hy vọng nó có thể giúp đỡ người khác.