জাজানো টেম্পলেটগুলিতে লুপের জন্য সংখ্যাযুক্ত


261

forজ্যাঙ্গো টেমপ্লেটে আমি কীভাবে একটি সংখ্যাযুক্ত লুপ লিখব ? আমি এরকম কিছু বোঝাতে চাইছি

for i = 1 to n

উত্তর:


392

আমি একটি সাধারণ কৌশল ব্যবহার করেছি যা কোনও বিশেষ ট্যাগ এবং কোনও অতিরিক্ত প্রসঙ্গ ছাড়াই ছোট মামলার জন্য দুর্দান্তভাবে কাজ করে। কখনও কখনও এটি কাজে আসে

{% for i in '0123456789'|make_list %}
    {{ forloop.counter }}
{% endfor %}

9
এফডাব্লুআইডাব্লু, 012 == 12, সুতরাং এটি কেবল 1 এবং 2 এর উপরে লুপ করবে
জেসন

22
সমস্ত 10 পুনরুক্তি উপর, কুঁদন না 0. | {make_list% '0123456789' থেকে আমি%}
রিক

7
'রুল্ড' দিয়ে নির্বিচারে দৈর্ঘ্যের একটি স্ট্রিং উত্পন্ন করুন{% for i in "x"|rjust:"100" %}
হারুন

27
তৃতীয় বারের জন্য, এই উত্তরটি খারাপ । এটি ব্যবহার করবেন না। একটি টেমপ্লেট ট্যাগ ব্যবহার করুন এবং এটি সঠিকভাবে করুন। উত্তরটি কীভাবে খারাপ বলা যায় তা আমি দেখতে ব্যর্থ, কোনও মন্তব্য মুছতে যথেষ্ট কারণ।
616

6
@ রিবস এর সাথে এত খারাপ কী? নিশ্চিত যে এটি হ্যাকি, তবে কোনও প্রকল্পের জন্য আপনাকে একবারে একটি ছোট পরিসরে লুপ করা দরকার বলে একটি টেমপ্লেট ট্যাগ যুক্ত করাও এরকম দুর্দান্ত সমাধান নয়।
tobltobs

114
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

9
দুর্দান্ত উত্তর। কেন্দ্রগুলি কাজ করে কারণ কেন্দ্রটি n স্পেসগুলির একটি স্ট্রিং তৈরি করে যা পরে লুপ হয়ে যায়। তারপরে প্রতিটি স্পেস চরকে উপেক্ষা করা হবে তবে পরিসরের বর্তমান মান forloop.counter (বা forloop.counter0) থেকে পাওয়া যাবে। ডকস.ডজ্যাঙ্গোপ্রজেক্ট.com
dev/

2
দুর্দান্ত উত্তর! নতুন ফিল্টার তৈরি করতে হয়নি।
মিগুয়েল আইকে

দৃষ্টিতে কিছু করার দরকার নেই। দুর্দান্ত হ্যাক
মোহাম্মদ শরীফ সি

106

দুর্ভাগ্যক্রমে, এটি জ্যাঙ্গো টেম্পলেট ভাষায় সমর্থিত নয় । একটা হয় দম্পতি এর পরামর্শ , কিন্তু তারা একটি সামান্য জটিল মনে হচ্ছে। আমি প্রসঙ্গে একটি পরিবর্তনশীল রাখব:

...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...

এবং টেমপ্লেটে:

{% for i in range %}
     ...
{% endfor %}

13
টেমপ্লেটগুলিতে জ্যাঙ্গো লেখকরা সরল অজগরটিকে প্রত্যাখ্যান করার জন্য যে অনুপ্রেরণাগুলি অনুভব করেছিল তা বেদনা এবং হারিয়ে যাওয়া সময়ের সাথে তুলনায় ব্যর্থতার সাথে তুলনা করা অর্থহীন এবং অসংলগ্ন বলে মনে হয় না, যখন একেবারে দুর্দান্ত এক অজানা (অজগর!) পুরোপুরি নতুন ল্যাঙ্গেজ আবিষ্কার করার প্রয়োজনের কথা উল্লেখ না করে! ) ইতিমধ্যে ঠিক আছে!
বোগাতিয়ার

2
@ বোগাতিয়ার যদি আপনি যা চান তা কেবল জিনজা ২: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এএন /

78

আমার এই সমস্যাটি গ্রহণ করা, আমি মনে করি এটি সর্বোত্তম। আমি টেমপ্লেটগুলি ডিরেক্টরিতে একটি 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 %}

1
আমি মনে করি এটি সঠিক সমাধান। কি range(1, 16)নম্বর 1 থেকে শুরু না 0. পেতে
chhantyal

টেমপ্লেটগুলি ডিরেক্টরিতে একটি খালি ফাইল _ init _.py তৈরি করুন । এই লাইনটি my_filters.py এর শীর্ষে যুক্ত করুন 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 []। এইভাবে এটি কখনও ত্রুটি উত্থাপন করে না এবং খালি অ্যারেটি দেয় (সর্বাধিক টেমপ্লেট ফাংশনগুলি কীভাবে কাজ করে তা সমান)।
টিম টিসডাল


41

আপনি একটি বাঁধাই পাস করতে পারেন

{'n' : range(n) }

টেমপ্লেট, তারপর না

{% for i in n %}
...
{% endfor %}

মনে রাখবেন আপনি 0-ভিত্তিক আচরণ পাবেন (0, 1, ... n-1)।

(পাইথন 3 সামঞ্জস্যের জন্য আপডেট হয়েছে)


1
ব্যবহারের range(n)পাইথন 3, আমি যদি এটি সঠিকভাবে মনে রাখবেন, xrange এটিতে অবচিত করা হয়েছিল
Felício

হ্যাঁ হ্যাঁ পাইথন 3-তে একটি অ্যাপ্লিকেশন স্থানান্তরিত করার জন্য আমার দুটি কোডের লাইনের একটি সুযোগ ছিল।
ডেভ ডব্লিউ স্মিথ

9

আপনি nনিজেই পাস করেন না , বরং range(n)[0 থেকে এন -1 অন্তর্ভুক্তের পূর্ণসংখ্যার তালিকা], আপনার দৃষ্টিভঙ্গি থেকে আপনার টেম্পলেটটিতে এবং পরবর্তীকালে আপনি যা করেন {% for i in therange %}(যদি আপনি সাধারণ 0 এর পরিবর্তে একেবারে 1-ভিত্তিক জেদ করেন) -ভিত্তিক সূচক আপনি forloop.counterলুপের শরীরে ব্যবহার করতে পারেন ;-)।


9

এই প্রশ্নটি জুড়েই কেবল অন্য কাউকে আসে না ... আমি একটি টেম্পলেট ট্যাগ তৈরি করেছি যা আপনাকে একটি তৈরি করতে দেয় range(...): http://www.djangosnippets.org/snippets/1926/

'পরিসীমা' অন্তর্নির্মিত হিসাবে একই আর্গুমেন্টগুলি গ্রহণ করে এবং এতে একটি তালিকা তৈরি করে
'রেঞ্জ' এর ফলাফল

বাক্য গঠন:
    প্রসঙ্গ_নাম%} হিসাবে% এমক্রঞ্জ [শুরু,] থামান [, পদক্ষেপ]

উদাহরণ স্বরূপ:
    _% mkrange 5 10 2 কে কিছু_রং%} হিসাবে
    _% আমার জন্য কিছু_রং%}
      {{i}}: আমি আবার কিছু বলতে চাই \ n
    % end%% এর জন্য

উত্পাদন:
    5: আমি আবার কিছু বলতে চাই 
    7: আমি আবার কিছু বলতে চাই 
    9: আমি আবার কিছু বলতে চাই


1
-1 অ্যালেক্স পাইয়ের স্নিপেটের পক্ষে যা ভেরিয়েবল যুক্তিগুলির সমর্থন যোগ করে।
m000

9

আমি এই প্রশ্নের খুব কঠিন চেষ্টা, এবং আমি এখানে সেরা উত্তর খুঁজে: (থেকে জ্যাঙ্গো টেমপ্লেটে 7 বার কিভাবে লুপ করতে )

এমনকি আপনি আইডিএক্স অ্যাক্সেস করতে পারেন!

views.py:

context['loop_times'] = range(1, 8)

এইচটিএমএল:

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}

9

আপনি পাস করতে পারেন:

{'এন': ব্যাপ্তি (এন)}

টেমপ্লেট ব্যবহার করতে:

for% আমার জন্য এন%} ...%% এ%% এর জন্য


পাঠযোগ্য এবং সহজ, আপনি যদি পরবর্তী লোক কোডটি বজায় রাখেন তবে কী হচ্ছে তা বোঝা সহজ
রসদবিধি

7

টেমপ্লেটে আপনার " স্লাইস " ব্যবহার করা উচিত , এর উদাহরণ এটি:

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>

1
ওপি এটির জন্য যা খুঁজছিল তা নিশ্চিত না, তবে এটি আমি ঠিক যা খুঁজছিলাম। =)
GChorn

7

এই পদ্ধতিটি স্ট্যান্ডার্ড 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))
নিম্নলিখিত

@ বিডিলব্যাক এই কোডটি স্ট্যান্ডার্ড অজগর রেঞ্জের নকল করে। এমনকি এটি কোনও সুস্পষ্ট পদক্ষেপ প্যারামিটার ছাড়া নেতিবাচক ব্যাপ্তিকে সমর্থন করে না। >>> তালিকা (পরিসীমা (10,2)) [] >>> তালিকা (পরিসর (10,2, -1)) [10, 9, 8, 7, 6, 5, 4, 3]
রিবস

5

আমি জনপ্রিয় উত্তরটি কিছুটা এগিয়ে নিয়ে চলেছি এবং আরও দৃ 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 করতে পারেন। একটি পদক্ষেপ যুক্ত করার জন্য একটি টেম্পলেট ট্যাগের প্রয়োজন হবে, এটি আরও ব্যবহারের ক্ষেত্রে কভার করা উচিত যাতে এটি এক ধাপ এগিয়ে।


এটি @ গিলারমো-সিলিসিও-ট্রুবা উত্তরের একটি বর্ধন।
পল কেনজোরা

5

এটি মূলত একটি rangeফাংশন প্রয়োজন । এর জন্য একটি জ্যাঙ্গো বৈশিষ্ট্যযুক্ত টিকিট উত্থাপিত হয়েছিল ( https://code.djangoproject.com/ticket/13088 ) তবে নীচের মন্তব্যে "ঠিক করবে না" হিসাবে বন্ধ করা হয়েছে।

এই ধারণার আমার ধারণাটি এটি টেমপ্লেটে প্রোগ্রামিংয়ের দিকে পরিচালিত করার চেষ্টা করছে। যদি আপনার কাছে বিকল্পগুলির একটি তালিকা রয়েছে যা রেন্ডার করা দরকার, সেগুলি টেমপ্লেটে নয়, ভিউতে গণনা করা উচিত। যদি এটি মানগুলির একটি ব্যাপ্তির মতোই সহজ, তবে তা হ'ল।

তাদের একটি ভাল পয়েন্ট রয়েছে - টেমপ্লেটগুলি ভিউটির খুব সহজ উপস্থাপনা বলে মনে করা হয়। আপনার ভিউতে সীমিত প্রয়োজনীয় ডেটা তৈরি করা উচিত এবং প্রসঙ্গে টেমপ্লেটে পাস করা উচিত।


6
ভিউটি ডেটার জন্য হওয়া উচিত, টেমপ্লেটটি উপস্থাপনার জন্য হওয়া উচিত। ভিউটির জন্য টেমপ্লেটের বিষয়বস্তুগুলির নির্দিষ্ট জ্ঞানের প্রয়োজন হবে না। জ্যাঙ্গোর এই বৈশিষ্ট্যগুলির অনুরোধগুলি উপেক্ষা করার কারণ হ'ল সম্পূর্ণ জঞ্জাল।
রিবস

3

তুমি ব্যবহার করতে পার: {% with ''|center: i as range %}


1
এটি কীভাবে কাজ করে তার উদাহরণ / ব্যাখ্যা সরবরাহ করতে পারেন?
রিবস

1

যারা সহজ উত্তর খুঁজছেন, তাদের জন্য কেবলমাত্র একটি মূল্যবোধ প্রদর্শন করা দরকার, উদাহরণস্বরূপ 100 টি পোস্টের মধ্যে 3 টি বলুন কেবল এটি যুক্ত করুন {% for post in posts|slice:"3" %}এবং লুপ করুন এবং কেবলমাত্র 3 টি পোস্ট যুক্ত করা হবে।


0

যদি নম্বরটি কোনও মডেল থেকে আসে তবে আমি এটি মডেলটির কাছে একটি দুর্দান্ত প্যাচ বলে মনে করেছি:

def iterableQuantity(self):
    return range(self.quantity)

2
আপনি কেন ভোট দিচ্ছেন তা নিশ্চিত নন, এটি একটি বৈধ উত্তর। আমি উপরের সরবরাহ হিসাবে সঠিক ফিল্টার বাস্তবায়নের তুলনায় আমার এই সমাধানটি পছন্দ নয় ডিবি মডেলগুলি হাতাতে হবে। তবে এটি এখনও সর্বাধিক গৃহীত উত্তরের চেয়ে ভাল।
রিবস

আমি এমনকি জানি না ...
আল্পার

আমার 9 বছর অনেক দেরি হয়ে গেছে তবে আমি আপনাকে দুর্ভিক্ষকে উজ্জীবিত করেছি, এটি নিয়েও চিন্তা করবেন না।
সাহিল

-5
{% for i in range(10) %}
   {{ i }}

{% endfor %}

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
জিয়াভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.