জিনজা 2 টেমপ্লেট ভেরিয়েবল যদি না কোনও অবজেক্ট ডিফল্ট মান সেট করে


145

এই জাতীয় কিছু করার পরিবর্তে যদি বস্তুটি কিছুই না হয় তবে কীভাবে জিজন 2 ডিফল্টে একটি পরিবর্তনশীল করবেন?

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}

সুতরাং অবজেক্ট পি যদি কোনও হয় না আমি পি এর মান (প্রথম নাম এবং সর্বশেষ নাম) "" এ ডিফল্ট করতে চাই। মূলত

nvl(p.User[first_name'], "")

প্রাপ্তিতে ত্রুটি:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'

1
pকখনও না ফেরতের মান ফিরিয়ে দেয় এমন ফাংশনটি তৈরি করুন NoneNoneফাংশনটির পরিবর্তে প্রক্সি অবজেক্টের মতো প্রক্সি অবজেক্টের একই কাঠামো থাকা উচিত তবে এটি আপনি যে ডিফল্ট মানগুলি চান তা লোড করা উচিত।
মিগুয়েল

আমি এটি ব্যবহার করেছি এবং আমার সমস্যা সমাধান হয়েছে: p% যদি p! =%%} {{P.User ['first_name']}} {% endif%}
মোনা মোহামাদিনিয়া

উত্তর:


241

noneবিল্টিন ফাংশনটি ব্যবহার করুন ( http://jinja.pocoo.org/docs/templates/#none ):

{% if p is not none %}   
    {{ p.User['first_name'] }}
{% else %}
    NONE
{%endif %}

অথবা

{{ p.User['first_name'] if p != None else 'NONE' }}

অথবা আপনার যদি খালি স্ট্রিংয়ের প্রয়োজন হয়:

{{ p.User['first_name'] if p != None }}

19
noneউত্তরের ছোট হাতের দিকে লক্ষ্য করুন । আমি কারও ক্ষেত্রেই সংশোধন করার পরে আমার সমস্যা সমাধান হয়ে গেল।
হার্পারভিল


70

ডক্স অনুসারে আপনি কেবল এটি করতে পারেন:

{{ p|default('', true) }}

বুলিয়ান প্রসঙ্গে Noneকাস্টকে কারণ দিন False


আপডেট : লিন্ডগুলি যেমন উল্লেখ করেছে, এটি কেবলমাত্র সাধারণ ডেটা ধরণের জন্য কাজ করে।


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

31

অন্যান্য উত্তরগুলি ছাড়াও, ভেরিয়েবলটি এর মতো না হলে কেউ অন্য কিছু লিখতে পারে:

{{ variable or '' }}

3
আমি এই সরলতা অবাক! পাইথনের x or yহয় if x is false, then y, else x। দেখুন: 5.2। বুলিয়ান অপারেশনস - এবং, বা না
কেনজিওনো

10

এই দস্তাবেজ অনুসরণ করে আপনি এইভাবে এটি করতে পারেন:

{{ p.User['first_name']|default('NONE') }}

8
আমি এটি মনে করি না - "ডিফল্ট" টেম্পলেট ফিল্টারটি যদি মানটি অপরিজ্ঞাত / নিখোঁজ থাকে তবে ডিফল্ট মানটি দেয়।
কোডেপ

জবাবদিহি করার সময় আমার জন্য কাজ করেছেন। এটি আরও স্পষ্ট করে দিয়েছে: stackoverflow.com/q/28885184/1005215
নেহাল জে ওয়াণী

1
P নির্ধারিত হলে। তবে পি সংজ্ঞায়িত হলে এটি কাজ করে না
aloreলোর

5

"P" বা "p.User" কোনওটি না থাকাকালীন একটি ব্যতিক্রম ছোঁড়া এড়াতে আপনি ব্যবহার করতে পারেন:

{{ (p and p.User and p.User['first_name']) or "default_value" }}

4
আমার ভেরিয়েবলটি একটি ডিকের গভীরে দাফন করা হওয়ায় এটিই আমার পক্ষে কাজ করেছিল।
ক্র্যাকারজ্যাক

এটি প্রচুর যুক্তি দিয়ে কিছু অন্যদের পরিষ্কার করতে সহায়তা করে।
agগল 33322

1

অন্য সমাধান হিসাবে (কিছু পূর্ববর্তীগুলির সাথে একই রকম):

{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}

সর্বশেষ ভেরিয়েবল (p.User ['first_name']]) এর if definedপরে পরীক্ষা নেই Note


0

আমি সাধারণত একটি সংজ্ঞায়িত nvlফাংশন, এবং এটা করা globalsএবং filters

def nvl(*args):
    for item in args:
        if item is not None:
            return item
    return None

app.jinja_env.globals['nvl'] = nvl
app.jinja_env.filters['nvl'] = nvl

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

<span>Welcome {{ nvl(person.nick, person.name, 'Anonymous') }}<span>

// or 

<span>Welcome {{ person.nick | nvl(person.name, 'Anonymous') }}<span>

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