জ্যাঙ্গো টেমপ্লেট কীভাবে একটি ভেরিয়েবলের সাথে অভিধানের মান সন্ধান করতে হয়


234
mydict = {"key1":"value1", "key2":"value2"}

একটি জ্যাঙ্গো টেমপ্লেটে একটি মান অভিধান অনুসন্ধান করতে নিয়মিত উপায় {{ mydict.key1 }}, {{ mydict.key2 }}। কীটি যদি লুপ ভেরিয়েবল হয়? অর্থাৎ,

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAMEব্যর্থ। কিভাবে এটি ঠিক করবেন?

উত্তর:


361

একটি কাস্টম টেম্পলেট ফিল্টার লিখুন:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(আমি এটি ব্যবহার করি .getযাতে কীটি অনুপস্থিত থাকলে, এটি কোনওটিই ফেরত দেয় না you আপনি যদি dictionary[key]এটি করেন KeyErrorতবে এটি উত্থাপন করবে ))

ব্যবহার:

{{ mydict|get_item:item.NAME }}

16
ভবিষ্যতে এটি সন্ধানকারীদের জন্য জাজানো কাস্টম টেম্পলেট ট্যাগ ডকুমেন্টেশন
জেফ

281
কেন এটি ডিফল্টরূপে অন্তর্নির্মিত হয় না? :-(
বেরিস্লাভ লোপাক


5
Jinja2 মধ্যে {{mydict [Key]}}
Evgeny

9
ফিল্টারটি ভিউ.পি, কিছু অতিরিক্ত ফিল্টার.পি বা কোন ফাইলে যায়?
অ্যালানএসই

56

লুপে অভিধান থেকে কী এবং মান উভয়ই আনুন:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

আমি এটি পড়তে সহজ মনে করি এবং এটি বিশেষ কোডিংয়ের প্রয়োজনীয়তা এড়ায়। আমার যেভাবেই লুপের ভিতরে কী এবং মানটি প্রয়োজন।


28
তিনি কোনও ডিকের গণনা করতে বলেন নি (যেমন আপনি দেখান) - তিনি একটি ভেরিয়েবল কী দিয়ে ডকের মান পেতে বলেছিলেন। আপনার প্রস্তাবটি সমাধান সরবরাহ করে না।
স্তম্ভিত

এটি একটি সমাধান (কেবলমাত্র খুব অদক্ষ) কারণ আপনি ডিকের আইটেমগুলি গণনা করতে পারেন এবং তারপরে তালিকা থেকে কীটির সাথে মেলে।
ডিলানইং

1
মনে রাখবেন যে আপনি যে অভিধানটি অ্যাক্সেস করতে চেষ্টা করছেন তার ভিতরে অন্য অভিধান রয়েছে তবে এটি কাজ করে না।
J0ANMM

যদি আপনার মানগুলি ডিক্ট হয় তবে লুপের জন্য কীগুলি এবং মানগুলি প্রক্রিয়াকরণের জন্য আপনি অন্য কোনওটিকে অন্তর্ভুক্ত করতে পারেন তবে সম্ভবত এই জটিলতা আপনাকে @ কুলেব্রনের উত্তরে বর্ণিত একটি কাস্টম ফিল্টার ব্যবহারের পক্ষে মূল্যবান হয়ে উঠছে।
পল হিপ

37

আপনি ডিফল্টরূপে পারবেন না। ডটটি বৈশিষ্ট্য অনুসন্ধান / কী দেখার / স্লাইসের জন্য বিভাজক / ট্রিগার।

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

  • অভিধান অনুসন্ধান। উদাহরণ: foo ["বার"]
  • বৈশিষ্ট্য অনুসন্ধান। উদাহরণ: foo.bar
  • তালিকা-সূচী অনুসন্ধান। উদাহরণ: ফু [বার]

তবে আপনি এমন একটি ফিল্টার তৈরি করতে পারেন যা আপনাকে একটি যুক্তিতে পাস করতে দেয়:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}

1
আমি তখনও ব্যবহার করব return value.get(arg)কারণ কীটি উপস্থিত না থাকলে কী-ইরর ব্যতিক্রম নিক্ষেপ করবে না।
স্লাজমা

3

আমার জন্য template_filters.pyনীচের বিষয়বস্তু সহ আমার অ্যাপে নামের একটি অজগর ফাইল তৈরি করা কাজটি করেছে

# coding=utf-8
from django.template.base import Library

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

ব্যবহার যেমন কুল্যবরন বলেছেন:

{{ mydict|get_item:item.NAME }}

কেন register = Library()? এটার কাজ কি ?
এমডি খায়রুল বাসার

2
আপনি যদি চান যে আপনার সমস্ত টেমপ্লেটগুলি আপনার নতুন ফিল্টার সম্পর্কে জানতে চান, তবে আপনাকে এটি django.template.base.Libraryক্লাসের আওতায় নিবন্ধিত করতে হবে । দ্বারা register = Library()আমরা instantiate যে বর্গ এবং ব্যবহারের filterফাংশন টিকা রচনা এটা ভিতরে আমাদের প্রয়োজন পৌঁছানোর।
আমিনিদিমি

2

আমারও একই অবস্থা ছিল। তবে আমি একটি ভিন্ন সমাধান ব্যবহার করেছি।

আমার মডেলে আমি এমন একটি সম্পত্তি তৈরি করি যা অভিধান অনুসন্ধান করে। টেমপ্লেটে আমি তখন সম্পত্তিটি ব্যবহার করি।

আমার মডেলটিতে: -

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

আমার টেমপ্লেটে: -

The state is: {{ item.state_ }}

1

যেহেতু আমি করতে পারবেন মন্তব্য, আমাকে একটা উত্তর আকারে এই কাজ:
উপর গড়ে তুলতে culebrón এর উত্তর বা Yuji 'Tomita' Tomita এর উত্তর , অভিধান ফাংশনে অতিক্রান্ত হওয়া একটি স্ট্রিং আকারে তাই সম্ভবত ব্যবহার AST। আক্ষরিক_ইভাল প্রথমে একটি অভিধানে স্ট্রিং রূপান্তর করতে, যেমন এই উদাহরণের মতো

এই সম্পাদনাটির সাথে কোডটি দেখতে এমন হওয়া উচিত:

@register.filter(name='lookup')
def lookup(value, arg):
    dictionary = ast.literal_eval(value)
    return value.get(arg)

{{ mydict|lookup:item.name }}

0

পরিবেশ: জাজানো ২.২

  1. উদাহরণ কোড:


    from django.template.defaulttags import register

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

আমি এই কোডটি আমার প্রকল্পের ফোল্ডারে পোর্টফোলিওএমজিআর নামে টেমপ্লেট_ফিল্টারসপিপি নামের একটি ফাইলে রেখেছি

  1. আপনি যেখানেই আপনার ফিল্টার কোডটি রেখেছেন তা নিশ্চিত না করে that ফোল্ডারে আপনার __init__.py আছে কিনা তা নিশ্চিত করুন

  2. আপনার প্রকল্পফোল্ডার / সেটিংস.পি ফাইলের টেম্পলেট বিভাগে লাইব্রেরি বিভাগে সেই ফাইলটি যুক্ত করুন। আমার জন্য, এটি পোর্টফোলিওগ্রাম / সেটিংস.পি



    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
                'libraries':{
                    'template_filters': 'portfoliomgr.template_filters',
                }
            },
        },
    ]
  1. আপনার এইচটিএমএল কোডটিতে লাইব্রেরি লোড করুন

    
    {% load template_filters %}

-2

env: django 2.1.7

দেখুন:

dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})

টেমপ্লেট:

{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>

1
টেমপ্লেট কোডটি {{ dict_obj.obj.obj_name }}পাইথন কোডের সমতুল্য এই ক্ষেত্রে dict_obj["obj"]["obj_name"], তবে, প্রশ্নটি এর সমতুল্য সম্পর্কে dict_obj[obj][obj_name]
ফ্লিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.