টেমপ্লেট কোডের মধ্যে কোনও ভেরিয়েবলের মান কীভাবে সেট করবেন?


216

বলুন আমার একটি টেম্পলেট আছে

<html>
<div>Hello {{name}}!</div>
</html>

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

{% set name="World" %}     
<html>
<div>Hello {{name}}!</div>
</html>

জ্যাঙ্গোতে কি এর মতো কিছু রয়েছে?

উত্তর:


327

আপনি withটেমপ্লেট ট্যাগ ব্যবহার করতে পারেন ।

{% with name="World" %}     
<html>
<div>Hello {{name}}!</div>
</html>
{% endwith %}

35
তবে আপনি কি দিয়ে ভেরিয়েবলের মান পরিবর্তন করতে পারবেন?
ডেভিড 天宇 ওয়াং

2
দেখে মনে হচ্ছে আপনি কোনও ধারক সহ একটি ধারক (আমি তালিকা এবং টিপল চেষ্টা করেছি) ঘোষণা করতে পারবেন না
ভ্লাদিস্লাভ ইভানশিন

আপনার যদি কোনও তালিকা ঘোষণা করতে হয় তবে মেক_লিস্ট ব্যবহার করুন। docs.djangoproject.com/en/1.9/ref/templates/builtins/#make-list
MrValdez

3
জিনজা বলে যে এটি {% সেট মাইভার = মান% set কেন এটি জ্যাঙ্গোতে কাজ করে না?
হলম

3
@ হোলস কারণ জ্যাঙ্গো জিনজা :-) ডকস.ডিজাঙ্গোপ্রজেক্ট
জেন /

50

একটি টেমপ্লেট ট্যাগ তৈরি করুন:

অ্যাপ্লিকেশন একটি থাকা উচিত templatetagsডিরেক্টরি, একই পর্যায়ে যেমন models.py, views.pyইত্যাদি যদি এই ইতিমধ্যে বিদ্যমান নয়, এটি তৈরি - ভুলবেন না __init__.pyফাইল নিশ্চিত করার ডিরেক্টরির একটি পাইথন প্যাকেজ হিসাবে গণ্য হবে।

নিম্নলিখিত কোড সহ টেমপ্লেটগুলি ডিরেক্টরি define_action.pyভিতরে একটি ফাইল তৈরি করুন :

from django import template
register = template.Library()

@register.simple_tag
def define(val=None):
  return val

দ্রষ্টব্য: বিকাশ সার্ভার স্বয়ংক্রিয়ভাবে পুনরায় আরম্ভ হবে না। templatetagsমডিউল যুক্ত করার পরে , আপনি টেমপ্লেটগুলিতে ট্যাগ বা ফিল্টার ব্যবহার করার আগে আপনাকে নিজের সার্ভারটি পুনরায় চালু করতে হবে।


তারপরে আপনার টেমপ্লেটে আপনি প্রাসঙ্গিকের জন্য মানগুলি নির্ধারণ করতে পারেন:

{% load define_action %}
{% if item %}

   {% define "Edit" as action %}

{% else %}

   {% define "Create" as action %}

{% endif %}


Would you like to {{action}} this item?

2
লুপের পরে আমার ক্ষেত্রে এটি পুরানো মানটি
ফেরায়

7
সর্বশেষতম সংস্করণে এটি প্রদর্শিত হবে যে আপনি অ্যাসাইনমেন্ট_ট্যাগের পরিবর্তে সরল_ট্যাগ ব্যবহার করতে পারেন (এবং এটি আমার পক্ষে কাজ করেছে)।
ক্যাথারিন

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

আপনি যদি কেবলমাত্র একটি মানের পরিবর্তে একটি তালিকা সেট করতে এই কৌশলটি ব্যবহার করতে চান তবে এটি পরীক্ষা করে দেখুন: stackoverflow.com/a/34407158/2193235
এমএসবি

যদি আপনি একটি পূর্ণসংখ্যা হিসাবে পরিবর্তনশীল সেটিং এবং আপনি এটিকে (উদাহরণস্বরূপ) বাড়ায় চান, আপনি ব্যবহার করতে হবে add: {% define counter|add:1 as counter %}। একইভাবে অন্যান্য অপারেশনগুলির জন্য।
এমএসবি

35

একটি বিকল্প উপায় যার প্রয়োজন নেই যে আপনি "উইথ" ব্লকের মধ্যে সমস্ত কিছু রাখুন একটি কাস্টম ট্যাগ তৈরি করা যা প্রসঙ্গে নতুন ভেরিয়েবল যুক্ত করে। হিসাবে:

class SetVarNode(template.Node):
    def __init__(self, new_val, var_name):
        self.new_val = new_val
        self.var_name = var_name
    def render(self, context):
        context[self.var_name] = self.new_val
        return ''

import re
@register.tag
def setvar(parser,token):
    # This version uses a regular expression to parse tag contents.
    try:
        # Splitting by None == splitting by spaces.
        tag_name, arg = token.contents.split(None, 1)
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0]
    m = re.search(r'(.*?) as (\w+)', arg)
    if not m:
        raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name
    new_val, var_name = m.groups()
    if not (new_val[0] == new_val[-1] and new_val[0] in ('"', "'")):
        raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
    return SetVarNode(new_val[1:-1], var_name)

এটি আপনাকে আপনার টেমপ্লেটে এমন কিছু লেখার অনুমতি দেবে:

{% setvar "a string" as new_template_var %}

নোট করুন যে এর বেশিরভাগটি এখান থেকে নেওয়া হয়েছিল


প্রসঙ্গে উপস্থিত অন্যান্য ভেরিয়েবলগুলিকে ভেরিয়েবল নির্ধারণ সম্পর্কে কীভাবে? এবং অন্য একটি নোটে: টেমপ্লেটগুলি ইতোমধ্যে উপস্থিত রয়েছে কিনা তা যাচাই না করে নির্বিচারে প্রসঙ্গের ভেরিয়েবলগুলি নির্ধারণের অনুমতি দিলে সুরক্ষা সম্পর্কিত প্রভাব থাকতে পারে। আমার মতে আরও বুদ্ধিমান পন্থাটি
হ'ল

যদি context.get (self.var_name): বাড়াতে SuspiciousOperation ( "টেমপ্লেট ইতিমধ্যে প্রেক্ষাপটে বর্তমান থেকে বরাদ্দ পরিবর্তনশীল করার প্রচেষ্টা")
soze

27

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


7
পয়েন্টারের জন্য ধন্যবাদ। ডিজাইনারের দৃষ্টিকোণ থেকে কখনও কখনও কোনও পৃষ্ঠার ডিজাইন করার সময় কোনও ভেরিয়েবল সেট করে রাখা খুব সহজ। এই অনুশীলনটি একটি চলমান কোডে ব্যবহার করার পরামর্শ দিচ্ছে না।
অ্যালেক্সিস

2
"উইথ" ট্যাগটি জ্যাঙ্গো ১.০-এ গৃহীত হয়েছে। সুতরাং দেখে মনে হচ্ছে তারা অবশেষে তাদের দর্শনের সংশোধন করছে :)।
ইভজেনি

2
তথ্য হিসাবে, "উইথ" ট্যাগটি কেবলমাত্র এলিয়াসগুলির জন্য। এটি পারফরম্যান্সে (এবং পাশাপাশি পঠনযোগ্যতার উপরও) বিশাল প্রভাব ফেলতে পারে তবে এটি আসলে .তিহ্যবাহী প্রোগ্রামিংয়ের ক্ষেত্রে কোনও পরিবর্তনশীল সেট করে না is
লুঠ করুন

12

এর জন্য সর্বোত্তম সমাধান হ'ল একটি কাস্টম লিখুন assignment_tag। এই সমাধানটি withট্যাগ ব্যবহারের চেয়ে আরও পরিষ্কার কারণ এটি যুক্তি এবং স্টাইলিংয়ের মধ্যে খুব স্পষ্ট বিভাজন অর্জন করে।

একটি টেম্পলেট ট্যাগ ফাইল তৈরি করে শুরু করুন (উদাঃ appname/templatetags/hello_world.py):

from django import template

register = template.Library()

@register.assignment_tag
def get_addressee():
    return "World"

এখন আপনি get_addresseeআপনার টেম্পলেটগুলিতে টেমপ্লেট ট্যাগটি ব্যবহার করতে পারেন :

{% load hello_world %}

{% get_addressee as addressee %}

<html>
    <body>
        <h1>hello {{addressee}}</h1>
    </body>
</html>

3
লোকেরা আরও নতুন জ্যাঙ্গো সংস্করণ ব্যবহার করছে, এটি এখন সরল_ট্যাগ বলে! আপনার
কোডগুলিতে

11

সম্ভবত ২০০৯ সালে defaultটেম্পলেট ফিল্টারটি কোনও বিকল্প ছিল না ...

<html>
<div>Hello {{name|default:"World"}}!</div>
</html>

আমি অবশ্যই বলব যে এটি আমি যা খুঁজছিলাম! এছাড়া সঙ্গে ব্যবহার করা যেতে পারে সঙ্গে : {% with state=form.state.value|default:other_context_variable %}পরিবর্তে other_context_variableআমরা কোনো ব্যবহার করতে পারেন 'string_value'হিসাবে ভাল
সৌরভ কুমার

তবে এটি এটি মুদ্রণ করবে এবং আমার এটি পরবর্তী ব্যবহারের জন্য সংরক্ষণ করতে হবে
হলস

4

এটি সাধারণভাবে ভাল ধারণা নয়। পাইথনে সমস্ত যুক্তি করুন এবং প্রদর্শনের জন্য টেমপ্লেটে ডেটাটি দিন। নকশায় কাজ করা লোকগুলি যুক্তি সম্পর্কে চিন্তা করার চেয়ে ডিজাইনে ফোকাস করতে পারে তা নিশ্চিত করার জন্য টেমপ্লেটটি যথাসম্ভব সহজ হওয়া উচিত।

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


3

বিবৃতি সহ ব্যবহার করুন ।

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

আমি এই উত্তরে প্রথম অনুচ্ছেদে কোডটি বোঝাতে পারি না । সম্ভবত টেমপ্লেট ভাষাটি পুরানো ফর্ম্যাটটিকে অবমূল্যায়ন করেছে।


2

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

{% jump_link as name %}
{% for obj in name %}
    <div>{{obj.helo}} - {{obj.how}}</div>
{% endfor %}

আপনার টেম্পলেট-ট্যাগগুলিতে আপনি এই জাতীয় ট্যাগ যুক্ত করতে পারেন:

@register.assignment_tag
def jump_link():
    listArr = []
    for i in range(5):
        listArr.append({"helo" : i,"how" : i})
    return listArr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.