ساخت تگِ دلخواه برای قالب (Custom Template Tags)

جنگو

سلام

داخل فولدر برنامۀ boards یک فولدر با نام templatetags و درون آن دو فایل خالی با نام‌های init__.py__ و form_tags.py ایجاد می کنیم.

myproject/
 |-- myproject/
 |    |-- accounts/
 |    |-- boards/
 |    |    |-- migrations/
 |    |    |-- templatetags/        <-- here
 |    |    |    |-- __init__.py
 |    |    |    +-- form_tags.py
 |    |    |-- __init__.py
 |    |    |-- admin.py
 |    |    |-- apps.py
 |    |    |-- models.py
 |    |    |-- tests.py
 |    |    +-- views.py
 |    |-- myproject/
 |    |-- static/
 |    |-- templates/
 |    |-- db.sqlite3
 |    +-- manage.py
 +-- venv/

می خواهیم دو عدد تگِ قالب درون فایل form_tags.py ایجاد کنیم.

boards/templatetags/form_tags.py

from django import template

register = template.Library()

@register.filter
def field_type(bound_field):
    return bound_field.field.widget.__class__.__name__

@register.filter
def input_class(bound_field):
    css_class = ''
    if bound_field.form.is_bound:
        if bound_field.errors:
            css_class = 'is-invalid'
        elif field_type(bound_field) != 'PasswordInput':
            css_class = 'is-valid'
    return 'form-control {}'.format(css_class)

(اگر معتبر بود و پسورد نبود کلاس css را مطابق با ‘is-valid’ قرار می دهد.)

در قطعه کد بالا از فیلترهای قالب استفاده شده است. عملکرد آن ها به این شکل است:

اول از همه آن ها را درون قالب بارگذاری می کنیم. دقیقا مشابه همان کاری که در خصوص تگ‌های قالب widget_tweaks و static  انجام دادیم. دقت کنید که بعد از ساخت این فایل باید سرور جنگو را متوقف کرده و دوباره آن را راه اندازی کنید تا جنگو تگ‌های جدید را شناسایی کند.

{% load form_tags %}

سپس بعد از این کار می توانیم از این ها در قالب استفاده کنیم.

{{ form.username|field_type }}

که عبارت ‘TextInput’ را باز خواهد گرداند.

یا در مورد input_classها:

{{ form.username|input_class }}

<!-- if the form is not bound, it will simply return: -->
'form-control '

<!-- if the form is bound and valid: -->
'form-control is-valid'

<!-- if the form is bound and invalid: -->
'form-control is-invalid'

حالا باید قالب form.html را برای استفاده از تگ‌های‌ جدید قالب بروز کنیم.

templates/includes/form.html

{% load form_tags widget_tweaks %}

{% if form.non_field_errors %}
  <div class="alert alert-danger" role="alert">
    {% for error in form.non_field_errors %}
      <p{% if forloop.last %} class="mb-0"{% endif %}>{{ error }}</p>
    {% endfor %}
  </div>
{% endif %}

{% for field in form %}
  <div class="form-group">
    {{ field.label_tag }}
    {% render_field field class=field|input_class %}
    {% for error in field.errors %}
      <div class="invalid-feedback">
        {{ error }}
      </div>
    {% endfor %}
    {% if field.help_text %}
      <small class="form-text text-muted">
        {{ field.help_text|safe }}
      </small>
    {% endif %}
  </div>
{% endfor %}

بهتر نشد؟ قالب ما ساده تر شد و همچنین مشکلی که با فیلد پسورد داشتیم هم حل و برطرف شد و دیگر کادر سبز را نمایش نمی دهد.

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: تست تگ های قالب

مطلب قبلی: خطاهای فیلدهای خالی در ورودی کاربر

 

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جنگو
پیکربندی گواهینامۀ https

سلام حالا می خواهیم برنامۀ خودمان را با گواهینامۀ https امن کنیم. ساده ترین کار برای انجام آن Let’s Encrypt است. قبل از Let’s Encrypt هرگز تنظیمات https به این راحتی نبوده و مهمتر اینکه اینکار کاملاً رایگان است. آن ها راه حلی به نام certbot را ارائه داده اند …

جنگو
پیکربندی سرویس ایمیل

سلام یکی از بهتر سرویس دهنده های ایمیل Mailgun با قابلیت ۱۲ هزار ایمیل رایگان در ماه است. به صورت رایگان ثبت نام کنید. برای اینکار باید آن را با سرویس دهندۀ دامین خود تنظیم کنید که در این آموزش از tamadon.org استفاده شده است. حالا اولین رکورد DNS را …

جنگو
پیکربندی NGINX

سلام کار بعدی که قرار است انجام شود؛ تنظیمان Nginx به شکلی است که پاسخگویی و سرویس دهی مربوط به فایل های استاتیک را خود انجام دهد و سایر درخواست ها را به Gunicorn بفرستد. یک فایل پیکربندی با نام boards را درون /etc/nginx/sites-available/ و با محتوای زیر اضافه می …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.