উত্তর:
আমি একটি সাধারণ কৌশল ব্যবহার করেছি যা কোনও বিশেষ ট্যাগ এবং কোনও অতিরিক্ত প্রসঙ্গ ছাড়াই ছোট মামলার জন্য দুর্দান্তভাবে কাজ করে। কখনও কখনও এটি কাজে আসে
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
দুর্ভাগ্যক্রমে, এটি জ্যাঙ্গো টেম্পলেট ভাষায় সমর্থিত নয় । একটা হয় দম্পতি এর পরামর্শ , কিন্তু তারা একটি সামান্য জটিল মনে হচ্ছে। আমি প্রসঙ্গে একটি পরিবর্তনশীল রাখব:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
এবং টেমপ্লেটে:
{% for i in range %}
...
{% endfor %}
আমার এই সমস্যাটি গ্রহণ করা, আমি মনে করি এটি সর্বোত্তম। আমি টেমপ্লেটগুলি ডিরেক্টরিতে একটি my_filters.py রাখি।
@register.filter(name='times')
def times(number):
return range(number)
এবং আপনি এটি ব্যবহার করতে হবে:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
range(1, 16)
নম্বর 1 থেকে শুরু না 0. পেতে
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
তারপরে যেমন ব্যবহার করা হয় {% for i in 1|range:6 %}{% endfor %}
। নীচে পূর্ণ উত্তর দেখুন ....
try: return range(number) except: return []
। এইভাবে এটি কখনও ত্রুটি উত্থাপন করে না এবং খালি অ্যারেটি দেয় (সর্বাধিক টেমপ্লেট ফাংশনগুলি কীভাবে কাজ করে তা সমান)।
এরকম হতে পারে?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
আপনি একটি বাঁধাই পাস করতে পারেন
{'n' : range(n) }
টেমপ্লেট, তারপর না
{% for i in n %}
...
{% endfor %}
মনে রাখবেন আপনি 0-ভিত্তিক আচরণ পাবেন (0, 1, ... n-1)।
(পাইথন 3 সামঞ্জস্যের জন্য আপডেট হয়েছে)
range(n)
পাইথন 3, আমি যদি এটি সঠিকভাবে মনে রাখবেন, xrange এটিতে অবচিত করা হয়েছিল
আপনি n
নিজেই পাস করেন না , বরং range(n)
[0 থেকে এন -1 অন্তর্ভুক্তের পূর্ণসংখ্যার তালিকা], আপনার দৃষ্টিভঙ্গি থেকে আপনার টেম্পলেটটিতে এবং পরবর্তীকালে আপনি যা করেন {% for i in therange %}
(যদি আপনি সাধারণ 0 এর পরিবর্তে একেবারে 1-ভিত্তিক জেদ করেন) -ভিত্তিক সূচক আপনি forloop.counter
লুপের শরীরে ব্যবহার করতে পারেন ;-)।
এই প্রশ্নটি জুড়েই কেবল অন্য কাউকে আসে না ... আমি একটি টেম্পলেট ট্যাগ তৈরি করেছি যা আপনাকে একটি তৈরি করতে দেয় range(...)
: http://www.djangosnippets.org/snippets/1926/
'পরিসীমা' অন্তর্নির্মিত হিসাবে একই আর্গুমেন্টগুলি গ্রহণ করে এবং এতে একটি তালিকা তৈরি করে 'রেঞ্জ' এর ফলাফল বাক্য গঠন: প্রসঙ্গ_নাম%} হিসাবে% এমক্রঞ্জ [শুরু,] থামান [, পদক্ষেপ] উদাহরণ স্বরূপ: _% mkrange 5 10 2 কে কিছু_রং%} হিসাবে _% আমার জন্য কিছু_রং%} {{i}}: আমি আবার কিছু বলতে চাই \ n % end%% এর জন্য উত্পাদন: 5: আমি আবার কিছু বলতে চাই 7: আমি আবার কিছু বলতে চাই 9: আমি আবার কিছু বলতে চাই
আমি এই প্রশ্নের খুব কঠিন চেষ্টা, এবং আমি এখানে সেরা উত্তর খুঁজে: (থেকে জ্যাঙ্গো টেমপ্লেটে 7 বার কিভাবে লুপ করতে )
এমনকি আপনি আইডিএক্স অ্যাক্সেস করতে পারেন!
views.py:
context['loop_times'] = range(1, 8)
এইচটিএমএল:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
টেমপ্লেটে আপনার " স্লাইস " ব্যবহার করা উচিত , এর উদাহরণ এটি:
view.py এ
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
store_list.html:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
এই পদ্ধতিটি স্ট্যান্ডার্ড range([start,] stop[, step])
ফাংশনের সমস্ত কার্যকারিতা সমর্থন করে
<app>/templatetags/range.py
from django import template
register = template.Library()
@register.filter(name='range')
def _range(_min, args=None):
_max, _step = None, None
if args:
if not isinstance(args, int):
_max, _step = map(int, args.split(','))
else:
_max = args
args = filter(None, (_min, _max, _step))
return range(*args)
ব্যবহার:
{% load range %}
<p>stop 5
{% for value in 5|range %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10
{% for value in 5|range:10 %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10 step 2
{% for value in 5|range:"10,2" %}
{{ value }}
{% endfor %}
</p>
আউটপুট
<p>stop 5
0 1 2 3 4
</p>
<p>start 5 stop 10
5 6 7 8 9
</p>
<p>start 5 stop 10 step 2
5 7 9
</p>
for value in 0|range:"10,2"
। আপনাকে args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
আমি জনপ্রিয় উত্তরটি কিছুটা এগিয়ে নিয়ে চলেছি এবং আরও দৃ more় করে তুলছি। এটি আপনাকে যে কোনও শুরুর পয়েন্ট নির্দিষ্ট করতে দেয় তাই উদাহরণস্বরূপ 0 বা 1। এটি পাইথনের রেঞ্জ বৈশিষ্ট্যটিও ব্যবহার করে যেখানে শেষটি কম হয় তাই এটি উদাহরণস্বরূপ তালিকার দৈর্ঘ্যের সাথে সরাসরি ব্যবহার করা যায়।
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
তারপরে আপনার টেম্পলেটে কেবল উপরের টেম্পলেট ট্যাগ ফাইলটি অন্তর্ভুক্ত করুন এবং নিম্নলিখিতগুলি ব্যবহার করুন:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
এখন আপনি কেবল 0-6 বা হার্ড কোডিংয়ের পরিবর্তে 1-6 করতে পারেন। একটি পদক্ষেপ যুক্ত করার জন্য একটি টেম্পলেট ট্যাগের প্রয়োজন হবে, এটি আরও ব্যবহারের ক্ষেত্রে কভার করা উচিত যাতে এটি এক ধাপ এগিয়ে।
এটি মূলত একটি range
ফাংশন প্রয়োজন । এর জন্য একটি জ্যাঙ্গো বৈশিষ্ট্যযুক্ত টিকিট উত্থাপিত হয়েছিল ( https://code.djangoproject.com/ticket/13088 ) তবে নীচের মন্তব্যে "ঠিক করবে না" হিসাবে বন্ধ করা হয়েছে।
এই ধারণার আমার ধারণাটি এটি টেমপ্লেটে প্রোগ্রামিংয়ের দিকে পরিচালিত করার চেষ্টা করছে। যদি আপনার কাছে বিকল্পগুলির একটি তালিকা রয়েছে যা রেন্ডার করা দরকার, সেগুলি টেমপ্লেটে নয়, ভিউতে গণনা করা উচিত। যদি এটি মানগুলির একটি ব্যাপ্তির মতোই সহজ, তবে তা হ'ল।
তাদের একটি ভাল পয়েন্ট রয়েছে - টেমপ্লেটগুলি ভিউটির খুব সহজ উপস্থাপনা বলে মনে করা হয়। আপনার ভিউতে সীমিত প্রয়োজনীয় ডেটা তৈরি করা উচিত এবং প্রসঙ্গে টেমপ্লেটে পাস করা উচিত।
যারা সহজ উত্তর খুঁজছেন, তাদের জন্য কেবলমাত্র একটি মূল্যবোধ প্রদর্শন করা দরকার, উদাহরণস্বরূপ 100 টি পোস্টের মধ্যে 3 টি বলুন কেবল এটি যুক্ত করুন {% for post in posts|slice:"3" %}
এবং লুপ করুন এবং কেবলমাত্র 3 টি পোস্ট যুক্ত করা হবে।
যদি নম্বরটি কোনও মডেল থেকে আসে তবে আমি এটি মডেলটির কাছে একটি দুর্দান্ত প্যাচ বলে মনে করেছি:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}