জ্যাঙ্গো টেমপ্লেটে কোনও অভিধানের উপাদানটি কীভাবে অ্যাক্সেস করবেন?


181

আমি প্রতিটি পছন্দের ভোটের সংখ্যা মুদ্রণ করতে চাই। টেমপ্লেটে আমার এই কোডটি রয়েছে:

{% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}

votes কেবল একটি অভিধান choicesমডেল অবজেক্টের is

এটি এই বার্তার সাথে একটি ব্যতিক্রম উত্থাপন করে:

"Could not parse the remainder"

উত্তর:


63

জেফের মন্তব্যে প্রতিধ্বনি / প্রসারিত করার জন্য, আমার মনে হয় আপনার কী লক্ষ্য করা উচিত তা হ'ল আপনার পছন্দ শ্রেণীর একটি সম্পত্তি যা সেই বস্তুর সাথে সম্পর্কিত ভোটের সংখ্যা গণনা করে:

    class Choice(models.Model):
        text = models.CharField(max_length=200) 

        def calculateVotes(self):
            return Vote.objects.filter(choice = self).count()

        votes = property(calculateVotes)

এবং তারপরে আপনার টেমপ্লেটে, আপনি এটি করতে পারেন:

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}

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

আমি উপরের পদ্ধতিটি চেষ্টা করে দেখতে পেয়েছি যে এসআরসিএল ওআরএম কী উত্পন্ন করে তা আমি নিশ্চিত নই যে এটি আমার মাথার উপরের অংশটি বন্ধ করে দিবে যদি এটি বৈশিষ্ট্যগুলি প্রাক-ক্যাশে করে এবং কেবলমাত্র সম্পত্তিটির জন্য একটি সাবলেট তৈরি করে দেয় বা যদি এটি পুনরায় / অন- ভোট গণনা গণনা করতে ক্যোয়ারী চালানোর দাবি করুন। তবে এটি যদি নৃশংস প্রশ্ন উত্পন্ন করে, আপনি নিজেরাই যে তথ্য সংগ্রহ করেছেন তা দিয়ে আপনি সবসময় আপনার দৃষ্টিতে সম্পত্তিটি পপুলেট করতে পারেন।


ধন্যবাদ @ জোহান ইয়ার্ট, আপনার সমাধানটি আমার পক্ষে কাজ করেছে। আমি জাঙ্গো এবং অজগর থেকে নবাগত এবং কীভাবে ওআরএম তৈরি করা এসকিএল পাব তা বুঝতে পারি না।
মোহাম্মদ

আপনি এখানে বিটটির উত্তরটি খুঁজে পেতে পারেন: ডকস.ডজ্যাঙ্গোপ্রজেক্ট / এএন / দেব / ফাফ / মডেলস_… এটি বেশ সহজ, আসলে এবং এটি আপনার টেমপ্লেটে প্রদর্শিত হতে পারে, বা লগিংয়ের সুবিধা সহ লগইন করতে পারে তবে আপনাকে তা করতে হবে এটি কাজ করার জন্য DEBUG চালু করতে ভুলবেন না।
জন ইওয়ার্ট

এই সমাধানটি এমন সমস্যার জন্য নিখুঁত যে আমি জ্যাঙ্গো টেম্প্লেটিং + গুগল অ্যাপ ইঞ্জিন মডেলগুলির সাথে আসছি। আমি আশা করি আমি আপনাকে দুবার ভোট দিতে পারতাম।
কনরাড.ডায়ান

5
যদিও এটি কাজ করে, এটি খুব দক্ষ নয়। এটি একটি লুপে স্কেল কোয়েরি করছে (এমন কিছু যা আপনার এড়ানো উচিত)। ডিক দেখার জন্য আপনার নিজের ট্যাগ তৈরি করা সহজ: @ রেজিস্টার.ফিল্টার ডিফ লুক (ডি, কী): ডি এবং আইসিনস্ট্যান্স (ডি, ডিক): রিটার্ন ডি ডেট (কী)
dলোর

ক্লাস তৈরি করা অনেক বেশি ওভারহেড; .itemsকলটির সাথে মিলিত একটি আরও ভাল কাঠামোগত অভিধান (অন্য উত্তরগুলির মধ্যে একটিতে বর্ণিত) একটি অনেক সহজ সমাধান।
Zags

285
choices = {'key1':'val1', 'key2':'val2'}

এখানে টেমপ্লেটটি রয়েছে:

<ul>
{% for key, value in choices.items %} 
  <li>{{key}} - {{value}}</li>
{% endfor %}
</ul>

মূলত, .itemsএকটি জ্যাঙ্গো কীওয়ার্ড যা অভিধানকে জোড়ের তালিকায় বিভক্ত (key, value)করে, পাইথন পদ্ধতির মতো .items()। এটি একটি জ্যাঙ্গো টেমপ্লেটের একটি অভিধানে পুনরাবৃত্তি সক্ষম করে।


@ অ্যানাক্যারোলিনাটস (এবং অন্যরা) সুনির্দিষ্টভাবে নিশ্চিত করুন যে আপনি পছন্দসমূহ.আইটিএমএসের মান, কী উভয় দিয়েই পুনরুক্ত করেছেন। এটি এখনও কাজ করা উচিত।
ওল্ডটাইনফয়েল

অবশেষে! ধন্যবাদ!! : ডি
ডিজেগ্রিল

সুতরাং টেমপ্লেট ইঞ্জিন () ব্যবহার করতে পারে না। বিটিডব্লিউ ধন্যবাদ আমার জন্য ধন্যবাদ।
ব্লেশডো

6
প্রশ্নের দুর্দান্ত সংক্ষিপ্ত সমাধান। স্পষ্ট করার জন্য, itemsঅভিধানে পাইথন পদ্ধতি কলটি, জ্যাঙ্গো কীওয়ার্ড নয়। অ্যালেক্স মার্টেলি যেমন উল্লেখ করেছেন এটি মূলত একই রকম iteritems। উইলহেলম উত্তর হিসাবে, ডট লকআপের জন্য অভিধান অনুসন্ধান তৃতীয় is আপনার নামের অভিধানে যদি আপনার কোনও আইটেম থাকে তবে আপনি 'items'টিপলগুলির তালিকার পরিবর্তে সেই মানটি ফিরে পাবেন। পরীক্ষা করতে: {'items':'oops'}আপনার অভিধানে যুক্ত করুন এবং আপনি '
ওফস

1
সংগ্রহগুলি ব্যবহার করুন
ite

185

আপনি ডট স্বরলিপি ব্যবহার করতে পারেন:

বিন্দু দর্শনগুলির সংক্ষিপ্তসার এইভাবে দেওয়া যেতে পারে: টেমপ্লেট সিস্টেমটি যখন কোনও ভেরিয়েবল নামের সাথে একটি বিন্দুর মুখোমুখি হয়, তখন এটি নিম্নলিখিত ক্রমগুলি এই ক্রমে চেষ্টা করে:

  • অভিধানের অনুসন্ধান (উদাহরণস্বরূপ, ফু ["বার"])
  • বৈশিষ্ট্য অনুসন্ধান (উদাহরণস্বরূপ, foo.bar)
  • পদ্ধতি কল (যেমন, foo.bar ())
  • তালিকা-সূচী অনুসন্ধান (উদাহরণস্বরূপ, ফু [2])

সিস্টেমটি কাজ করে এমন প্রথম লুক টাইপ ব্যবহার করে। এটি শর্ট সার্কিট যুক্তি।


44
তার ক্ষেত্রে পছন্দটি একটি পরিবর্তনশীল। .চয়েস করা কী "পছন্দ" এর চেয়ে মূল পছন্দটির জন্য মানটি দেখবে।
ইবজ

তথ্যের জন্য +1, যদিও প্রশ্নটি "ধীরে ধীরে আমি কী ভাবছি" অনুমান করা প্রশ্ন ছিল। ধন্যবাদ উইলহেম
ইফিকার

1
এটি নেস্টেড ডিকশনারিগুলির সাথেও কাজ করে। পাইথন কোড: my_dict[1][2]টেমপ্লেট কোড:my_dict.1.2
djsmith 26'12

2
@ জেসিএলিটো কারণ সঠিক সংস্করণটি d.key.1- দ্বিতীয়টি দ্রষ্টব্য.
ইজকাটা

3
যদিও এতে "1.6 ডকস.ডজ্যাঙ্গোপ্রজেক্ট / এন / ১./ / টপিকস / টেম্প্লেটস / টু ভেরিয়েবলস " থেকে দস্তাবেজগুলি পরীক্ষা করুন : নোট করুন যে { oo foo.bar } like এর মতো একটি টেম্পলেট এক্সপ্রেশনতে "বার" ব্যাখ্যা করা হবে আক্ষরিক স্ট্রিং হিসাবে এবং টেম্পলেট প্রসঙ্গে যদি বিদ্যমান থাকে তবে "বার" ভেরিয়েবলের মান ব্যবহার না করা।
জামেস্ক

25

উদাহরণস্বরূপ, এখানে আপনাকে একটি 'get' টেম্পলেট ট্যাগ (বা সংজ্ঞায়িত) করতে হবে ।

ট্যাগ সংজ্ঞা:

@register.filter
def hash(h, key):
    return h[key]

এবং এটি ব্যবহার করা হয়:

{% for o in objects %}
  <li>{{ dictionary|hash:o.id }}</li>
{% endfor %}

3
h.get(key,'default_value')কী
এররের



6

@ রুশিয়ান_স্পাইয়ের উত্তরের মতো:

<ul>
{% for choice in choices.items %} 
  <li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>

এটি আরও জটিল অভিধান ভাঙ্গার জন্য উপযুক্ত হতে পারে।


3

আদর্শভাবে, আপনি পছন্দের বস্তুটিতে এমন একটি পদ্ধতি তৈরি করতে পারেন যা ভোটে নিজেকে খুঁজে পেয়েছিল বা মডেলগুলির মধ্যে একটি সম্পর্ক তৈরি করবে। অভিধান অনুসন্ধান সম্পাদন করে এমন একটি টেম্পলেট ট্যাগও কার্যকর হবে।

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