Поиск…


переменные

Переменные, которые вы предоставили в контексте просмотра, можно получить с помощью двухстрочной записи:

На вашем views.py :

class UserView(TemplateView):
  """ Supply the request user object to the template """

  template_name = "user.html"

  def get_context_data(self, **kwargs):
    context = super(UserView, self).get_context_data(**kwargs)
    context.update(user=self.request.user)
    return context

В user.html :

<h1>{{ user.username }}</h1>

<div class="email">{{ user.email }}</div>

Точечная нотация будет доступна:

  • свойства объекта, например user.username будет {{ user.username }}
  • словарный поиск, например request.GET["search"] будет {{ request.GET.search }}
  • методы без аргументов, например users.count() будет {{ user.count }}

Переменные шаблона не могут обращаться к методам, которые принимают аргументы.

Переменные также могут быть протестированы и зациклены:

{% if user.is_authenticated %}
  {% for item in menu %}
    <li><a href="{{ item.url }}">{{ item.name }}</a></li>
  {% endfor %}
{% else %}
  <li><a href="{% url 'login' %}">Login</a>
{% endif %}

Доступ к URL-адресам осуществляется с использованием формата {% url 'name' %} , где имена соответствуют именам в вашем urls.py

{% url 'login' %} - вероятно, будет отображаться как /accounts/login/
{% url 'user_profile' user.id %} - Аргументы для URL-адресов поставляются в порядке
{% url next %} - URL-адреса могут быть переменными

Шаблоны в классах

Вы можете передавать данные в шаблон в пользовательской переменной.

На вашем views.py :

from django.views.generic import TemplateView
from MyProject.myapp.models import Item

class ItemView(TemplateView):
    template_name = "item.html"

    def items(self):
        """ Get all Items """
        return Item.objects.all()

    def certain_items(self):
        """ Get certain Items """
        return Item.objects.filter(model_field="certain")
    
    def categories(self):
        """ Get categories related to this Item """
        return Item.objects.get(slug=self.kwargs['slug']).categories.all()

Простой список в item.html :

{% for item in view.items %}
<ul>        
    <li>{{ item }}</li>
</ul>
{% endfor %}

Вы также можете получить дополнительные свойства данных.

Если предположить , что модель Item имеет name поля:

{% for item in view.certain_items %}
<ul>        
    <li>{{ item.name }}</li>
</ul>
{% endfor %}

Шаблоны в функциональных представлениях

Вы можете использовать шаблон в представлении, основанном на функции, следующим образом:

from django.shortcuts import render

def view(request):
    return render(request, "template.html")

Если вы хотите использовать переменные шаблона, вы можете сделать это следующим образом:

from django.shortcuts import render

def view(request):
    context = {"var1": True, "var2": "foo"}
    return render(request, "template.html", context=context)

Затем в template.html вы можете ссылаться на свои переменные следующим образом:

<html>
{% if var1 %}
    <h1>{{ var2 }}</h1>
{% endif %}
</html>

Фильтры шаблонов

Шаблонная система Django имеет встроенные теги и фильтры , которые являются функциями внутри шаблона для отображения контента определенным образом. Несколько фильтров могут быть указаны с помощью труб, а фильтры могут иметь аргументы, как и в переменном синтаксисе.

{{ "MAINROAD 3222"|lower }}    # mainroad 3222
{{ 10|add:15}}                 # 25
{{ "super"|add:"glue" }}       # superglue
{{ "A7"|add:"00" }}            # A700
{{ myDate | date:"D d M Y"}}   # Wed 20 Jul 2016   

Список доступных встроенных фильтров можно найти на странице https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ref-templates-builtins-filters .

Создание настраиваемых фильтров

Чтобы добавить собственные фильтры шаблонов, создайте в папке приложения папку с именем templatetags . Затем добавьте __init__.py и файл, в который будут входить фильтры:

#/myapp/templatetags/filters.py
from django import template

register = template.Library()

@register.filter(name='tostring')
def to_string(value):
    return str(value)

Чтобы использовать фильтр, вам необходимо загрузить его в свой шаблон:

#templates/mytemplate.html
{% load filters %}
{% if customer_id|tostring = customer %} Welcome back {% endif%}

Трюки

Несмотря на то, что фильтры сначала кажутся простыми, это позволяет сделать некоторые изящные вещи:

{% for x in ""|ljust:"20" %}Hello World!{% endfor %}    # Hello World!Hello World!Hel...    
{{ user.name.split|join:"_" }} ## replaces whitespace with '_' 

См. Также теги шаблонов для получения дополнительной информации.

Предотвращение вызова чувствительных методов в шаблонах

Когда объект подвергается контексту шаблона, доступны его методы без аргументов. Это полезно, когда эти функции являются «getters». Но это может быть опасно, если эти методы изменяют некоторые данные или имеют некоторые побочные эффекты. Несмотря на то, что вы, вероятно, доверяете создателю шаблона, он может не знать о побочных эффектах функции или ошибочно считать неправильный атрибут.

Учитывая следующую модель:

class Foobar(models.Model):
    points_credit = models.IntegerField()

    def credit_points(self, nb_points=1):
        """Credit points and return the new points credit value."""
        self.points_credit = F('points_credit') + nb_points
        self.save(update_fields=['points_credit'])
        return self.points_credit

Если вы напишете это, по ошибке, в шаблоне:

 You have {{ foobar.credit_points }} points!

Это будет увеличивать количество точек каждый раз при вызове шаблона. И вы даже этого не заметите.

Чтобы предотвратить это, вы должны установить для атрибута alters_data значение True для методов, имеющих побочные эффекты. Это сделает невозможным вызывать их из шаблона.

def credit_points(self, nb_points=1):
    """Credit points and return the new points credit value."""
    self.points_credit = F('points_credit') + nb_points
    self.save(update_fields=['points_credit'])
    return self.points_credit
credit_points.alters_data = True

Использование {% extends%}, {% include%} и {% blocks%}

резюме

  • {% extends%} : объявляет шаблон, указанный в качестве аргумента как родитель текущего шаблона. Использование: {% extends 'parent_template.html' %} .

  • {% block%} {% endblock%} : используется для определения разделов в ваших шаблонах, так что, если другой шаблон расширяет этот, он сможет заменить любой HTML-код, который был написан внутри него. Блоки идентифицируются по их имени. Использование: {% block content %} <html_code> {% endblock %} .

  • {% include%} : это вставляет шаблон в текущий. Имейте в виду, что включенный шаблон получит контекст запроса, и вы также можете указать его собственные переменные. Основное использование: {% include 'template_name.html' %} , использование с переменными: {% include 'template_name.html' with variable='value' variable2=8 %}

Руководство

Предположим, что вы создаете код своей стороны, имея общие макеты для всего кода, и вы не хотите повторять код для каждого шаблона. Django дает вам встроенные теги для этого.
Предположим, у нас есть один блог-сайт с 3 шаблонами, которые имеют один и тот же макет:

project_directory
    ..
    templates
      front-page.html
      blogs.html
      blog-detail.html

1) Определите файл base.html ,

<html>
  <head>
  </head>

  <body>
        {% block content %}
        {% endblock %}
   </body>
</html>

2) Расширьте его в blog.html например,

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
{% endblock %}

# None of the code written here will be added to the template

Здесь мы расширили базовый макет, поэтому его макет HTML теперь доступен в blog.html blog.html. Концепция { % block %} - это наследование шаблона, которое позволяет вам создать базовый шаблон скелета, который содержит все общие элементы вашего сайта и определяет блоки, которые дочерние шаблоны могут переопределить.

3) Теперь предположим, что все ваши 3 шаблона также имеют одинаковый HTML-div, который определяет некоторые популярные сообщения. Вместо того, чтобы писать три раза, создайте один новый шаблон posts.html .

blog.html

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
    {% include 'posts.html' %} # includes posts.html in blog.html file without passing any data
    <!-- or -->
    {% include 'posts.html' with posts=postdata %} # includes posts.html in blog.html file with passing posts data which is context of view function returns.
{% endblock %}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow