Гузариш ба мундариҷа
Мавзӯи 3 аз 6

Қолибҳои Django

Чаро қолибҳо лозиманд

Рӯйхати толорҳои осорхона ҳар рӯз тағйир меёбад, вале сохтори HTML-и саҳифа ҳамон мемонад. Агар онро бо пайвастани сатрҳо дар view созем, теги пӯшандаро гум кардан ё HTML-и корбарро тасодуфан гузоштан осон аст. Қолиб намуди зоҳириро аз маълумот ҷудо мекунад ва бо нобаёнӣ аломатҳои хатарнокро escape мекунад.

Контекст луғати қиматҳо барои саҳифа аст. Қолиб матнест бо ҷойҳои ивазкунӣ ва сохторҳои одии идоракунӣ. Рендеринг аз қолибу контекст сохтани сатри тайёр аст. Python муайян мекунад, ки кадом сабтҳо бор шаванд; қолиб муайян мекунад, ки онҳо чӣ гуна нишон дода шаванд.

Ивазкунии аввал

Дар лоиҳа қолибҳо одатан дар templates/ ҷойгиранд ва render(request, "page.html", context) ҷавоби HTTP бармегардонад. Дар курс нигоҳ доштани қолиб дар сатр қулай аст. Муҳаррикро як бор танзим мекунем; ҳамаи мисолҳои баъдӣ идомаи ҳамин файл мебошанд.

{{ title }} қиматро мегузорад. Context луғатро ба объекти фаҳмои муҳаррик табдил медиҳад. Натиҷаи .render() сатр аст, на ҷавоби HTTP.

import django
from django.conf import settings

settings.configure(
    USE_I18N=False,
    TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates"}],
)
django.setup()

from django.template import Template, Context

t = Template("<h1>{{ title }}</h1>")
print(t.render(Context({"title": "Осорхона"})))
print(t.render(Context({"title": "<b>Осорхона</b>"})))

Натиҷа:

<h1>Осорхона</h1>
<h1>&lt;b&gt;Осорхона&lt;/b&gt;</h1>

Нуқта, давра ва рӯйхати холӣ

Нуқта дар room.title аввал калиди луғат, баъд атрибутро меҷӯяд; барои пайдарпайӣ индекс, масалан items.0, имконпазир аст. Забони қолибҳо даъватҳои Python-ро бо қавсҳо мисли room.title.upper() дастгирӣ намекунад. Барои табдилдиҳӣ филтрҳо ҳастанд.

Теги {% for %} порчаро барои ҳар унсур такрор мекунад. forloop.counter аз як ва forloop.counter0 аз сифр мешуморад. Шохаи {% empty %} ҳангоми набудани унсурҳо иҷро мешавад. Он ба давра тааллуқ дорад ва шарти ҷудо намехоҳад.

t = Template("{% for room in rooms %}{{ forloop.counter }}:{{ room.title }};{% empty %}Толорҳо нестанд{% endfor %}")
print(t.render(Context({"rooms": [{"title": "A"}, {"title": "B"}]})))
print(t.render(Context({"rooms": []})))
print(Template("{% if open %}OPEN{% else %}CLOSED{% endif %}").render(Context({"open": False})))

Натиҷа:

1:A;2:B;
Толорҳо нестанд
CLOSED

Филтрҳо ва тартиби татбиқи онҳо

Филтри пас аз | қиматро табдил медиҳад; аргумент пас аз дунуқта меояд. truncatewords шумораи калимаҳо ва truncatechars шумораи аломатҳоро бо ҳисоби сенуқта маҳдуд мекунад. length унсурҳоро мешуморад, upper регистрро дигар мекунад ва join сатрҳои рӯйхатро мепайвандад.

Занҷир аз чап ба рост ҳисоб мешавад. default барои қимати дурӯғмонанд қимати эҳтиётӣ медиҳад: сатри холӣ, рӯйхати холӣ, 0 ё False. Агар танҳо None иваз шавад, default_if_none ҳаст. Дар мисол аввал рӯйхатро мепайвандем, баъд сатри холии ҳосилшударо коркард мекунем.

print(Template('{{ text|truncatewords:2 }}').render(Context({"text": "Як ду се чор"})))
print(Template('{{ tags|join:", "|default:"Нишонаҳо нестанд" }}').render(Context({"tags": []})))
print(Template('{{ rooms|length }}').render(Context({"rooms": ["A", "B"]})))

Натиҷа:

Як ду …
Нишонаҳо нестанд
2

Санаҳо ва филтри худӣ

Филтри date объекти санаро қабул мекунад, на сатри дилхоҳро. Рамзҳои формат ба регистр ҳассосанд: Y соли чоррақама, m моҳи бо сифри аввал, d рӯзи бо сифри аввал, j рӯзи бе сифр ва H:i соату дақиқа мебошанд.

Филтри худӣ функсияи одиест, ки дар template.Library сабт шудааст. Дар ин ҷо муҳаррики ҷудои Engine сохта, китобхонаро ба template_builtins меафзоем, то мисол дар як файл кор кунад. Дар лоиҳаи одӣ китобхона дар templatetags/-и барномаи насбшуда ҷойгир буда, бо {% load ном %} пайваст мешавад; пайвасти умумиро бо OPTIONS.builtins муайян мекунанд.

Филтри дохилии pluralize пасвандҳоро интихоб мекунад, вале қоидаи се шакли русиро иҷро намекунад. Филтрҳои худӣ чунин қоидаро аз HTML ҷудо мекунанд. Филтри зер вазифаи дигари хурдро ҳал мекунад: такрори нишона.

from datetime import date
from django import template
from django.template import Engine

register = template.Library()

@register.filter
def repeat(value, count):
    return str(value) * int(count)

engine = Engine()
engine.template_builtins.append(register)
t = engine.from_string('{{ label|repeat:2 }} {{ day|date:"Y-m-d" }}')
print(t.render(Context({"label": "A", "day": date(2026, 2, 3)})))

Натиҷа:

AA 2026-02-03

Муҳаррик саҳифаро чӣ гуна месозад

Аввал Django матнро ба гиреҳҳо ҷудо мекунад: порчаҳои матн, тағйирёбандаҳо, давраҳо ва шартҳо. Баъд ҳар гиреҳ контекстро гирифта, қисми сатри худро медиҳад. Аз ин рӯ як объекти Template-ро бо луғатҳои гуногун истифода бурдан мумкин аст. Escape ҳангоми барориш сурат мегирад; маълумоти аслии контекст тағйир намеёбад.

Барои матни санҷиданашудаи корбар safe-ро истифода набаред: он муҳофизат аз воридкунии HTML-ро хомӯш мекунад. Дастрасӣ бо нуқта метавонад методи бе аргументи дастрасро низ даъват кунад; ҳисобҳои мураккаб ва интихоби сабтҳоро дар view омода кунед.

Хатоҳои маъмул ва ислоҳҳо

  1. {{ for room in rooms }} ҳамчун тағйирёбанда навишта шуда, TemplateSyntaxError медиҳад. Сохторҳои идоракуниро бо {% for room in rooms %} навишта, бо {% endfor %} пӯшед.
  2. {{ text|truncatechars:5 }} аломатҳоро мебурад, ҳол он ки калимаҳо лозиманд. truncatewords:5 истифода бурда, ибораи аз панҷ калима дарозтарро санҷед.
  3. {{ missing }} одатан сатри холӣ дода, хатои навиштро пинҳон мекунад. Калидҳои контекстро бо номҳои қолиб муқоиса кунед; default-ро танҳо барои маълумоти эҳтимолан холӣ гузоред.
  4. {{ day|date:"y-m-d" }} соли дурақама медиҳад. Барои соли пурра Y-и калонро истифода баред; аввал сатрро ба сана табдил диҳед.
  5. {{ value|unknown }} ба TemplateSyntaxError меорад: филтрро сабт карда, китобхонаашро бор кунед. Танҳо таърифи функсия кофӣ нест.

Ёддошт

Ниёз Навишт
Қимати контекст {{ room.title }}
Шарт {% if open %}…{% else %}…{% endif %}
Давра ва шохаи холӣ {% for x in xs %}…{% empty %}…{% endfor %}
Рақами унсур {{ forloop.counter }}
Табдилдиҳӣ `{{ value
Матни эҳтиётӣ `{{ value
Филтри худӣ template.Library(), @register.filter