ساخت تگِ دلخواه برای قالب (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 %}
بهتر نشد؟ قالب ما ساده تر شد و همچنین مشکلی که با فیلد پسورد داشتیم هم حل و برطرف شد و دیگر کادر سبز را نمایش نمی دهد.

ترجمۀ اختصاصی توسط تمدن
مطلب بعدی: تست تگ های قالب
مطلب قبلی: خطاهای فیلدهای خالی در ورودی کاربر

دیدگاه خود را ثبت کنید
تمایل دارید در گفتگو شرکت کنید؟نظری بدهید!