Блок набора Jinja2 не распознается в Django - PullRequest
0 голосов
/ 06 марта 2020

Я искал 2 дня, прежде чем опубликовать это, так что я действительно надеюсь, что это не повторяющийся вопрос.

Я создаю свой первый Django сайт, и после того, как я на него зашел, я понял, что предпочел бы иметь Сила Джинджи2. Я установил jinja2 в свою виртуальную среду и внес необходимые изменения в django (см. Ниже). Тем не менее, django отображает шаблон с помощью стандартного механизма шаблонов django вместо jinja2.

Весь мой код работает должным образом при использовании {% block content%} содержимого шаблона {% endblock content%}

Вместо блока я пытаюсь использовать шаблон {% set%} content {% endset%}, чтобы я мог продублировать шаблон в базе. html. но я получаю эту ошибку:

django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 7: 'set'. Did you forget to register or load this tag?
[05/Mar/2020 22:27:37] "GET /bge/ HTTP/1.1" 500 161659

Я внес следующие изменения в свой проект, чтобы попытаться заставить работать jinja2:

Настройки:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2'
        ,
        'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'bge_app.jinja2.environment'
        },
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [(os.path.join(BASE_DIR, 'templates')),],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

jinja2.py добавлено в django_projects \ bge \ bge_app

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env

Это шаблон в django_projects \ bge \ bge_app \ templates \ jinja2 \ dice. html

{% extends "base.html" %}
{% load static %}
{% block title %}
<Title>Dice</Title>
{% endblock title %}

{% set dice_content %}
    <br/>
<div class="container">
    <div class="row">
        <form class="m-3" method="POST">
            {% csrf_token %}
            <div class="input-group">
              <div class="input-group-prepend">
                <button type="submit" class="btn btn-info">Add Die</button>
                {{ die_size_form.num_sides }}
                {{ die_size_form.active }}
              </div>
            </div>
        </form>
        <a href="{% url 'roll_dice' %}">
        <button type="button" class="btn btn-info m-3">Roll Dice</button>
        </a>
        <table class="m-2 table-bordered text-center">
            <tr>
            <th class="p-2">Roll Sum</th>
            </tr>
            <tr>
                <td>
                    {{ active_dice_sum }}
                </td>
            </tr>
        </table>
    </div>
        <table class="table-hover table-bordered text-center table-sm col-md-10">
            <tr>
                <th> Die Sides</th>
                <th> Die Status</th>
                <th> Roll Value</th>
                <th> Remove Die</th>
            </tr>
            {% for die in all_dice %}
                {% if die.active %}
                    {% if die.num_sides == 6 %}
                        <tr>
                            <td>D6 &nbsp;<img src="{% static '/images/dice/d6.png' %}" alt="D 6"></td>
                            <td><a href="{% url 'deactivate_die' die.id %}">
                                <button type="button" class="btn btn-success">Active</button>
                                </a>
                            </td>
                            <td> {{ die.roll_value }} </td>
                            <td><a href="{% url 'remove_die' die.id %}">
                            <button type="button" class="btn btn-danger">X</button>
                            </a>
                            </td>
                        </tr>
                    {% else %}
                        <tr>
                            <td>D {{ die.num_sides }}</td>
                            <td><a href="{% url 'deactivate_die' die.id %}">
                                <button type="button" class="btn btn-success">Active</button>
                                </a>
                            </td>
                            <td> {{ die.roll_value }} </td>
                            <td><a href="{% url 'remove_die' die.id %}">
                                <button type="button" class="btn btn-danger">X</button>
                                </a>
                            </td>
                        </tr>
                    {% endif %}
                {% else %}
                    <tr>
                        <td>D {{ die.num_sides }}</td>
                        <td><a href="{% url 'activate_die' die.id %}">
                            <button type="button" class="btn btn-secondary">Inactive</button>
                            </a>
                        <td> {{ die.roll_value }} </td>
                         <td><a href="{% url 'remove_die' die.id %}">
                        <button type="button" class="btn btn-danger">X</button>
                        </a>
                        </td>
                    </tr>
                {% endif %}
            {% endfor %}
        </table>
{% endset dice_content %}
</div>

Вот база. html

{% load static %}
<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

  <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
  <a class="navbar-brand" href="{% url 'index' %}"><i>Board Game Essentials</i></a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarNav">
    <ul class="navbar-nav">
      <li class="nav-item active">
        <a class="nav-link" href="{% url 'player_setup' %}">Player Setup</a>
      </li>
      <li class="nav-item active">
        <a class="nav-link" href="{% url 'die_pool' %}">Dice</a>
      </li>
      <li class="nav-item active">
        <a class="nav-link" href="{% url 'hp_tracker' %}">HP Tracker</a>
      </li>
      <li class="nav-item active">
        <a class="nav-link" href="{% url 'score_calc' %}">Score Calculator</a>
      </li>
    </ul>
  </div>
</nav>

{#want to call set multiple times here#}

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  </body>
</html>

1 Ответ

0 голосов
/ 06 марта 2020

base. html (некоторые изменения)

 <!doctype html>
    {% load static %}
    <html lang="en">
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>{% block title %} {% endblock %}</title>
        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    </head>
<body>
      <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
      <a class="navbar-brand" href="{% url 'index' %}"><i>Board Game Essentials</i></a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav">
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'player_setup' %}">Player Setup</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'die_pool' %}">Dice</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'hp_tracker' %}">HP Tracker</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'score_calc' %}">Score Calculator</a>
          </li>
        </ul>
      </div>
    </nav>

    {#want to call set multiple times here#}
    {% block set %}


{% endblock %}
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
      </body>
    </html>

ваши шаблоны

{% extends "base.html" %}
{% block title %}Your webpage title {% endblock %}
{% block set %}
<div class="container">
    <div class="row">
        <form class="m-3" method="POST">
            {% csrf_token %}
            <div class="input-group">
              <div class="input-group-prepend">
                <button type="submit" class="btn btn-info">Add Die</button>
                {{ die_size_form.num_sides }}
                {{ die_size_form.active }}
              </div>
            </div>
        </form>
        <a href="{% url 'roll_dice' %}">
        <button type="button" class="btn btn-info m-3">Roll Dice</button>
        </a>
        <table class="m-2 table-bordered text-center">
            <tr>
            <th class="p-2">Roll Sum</th>
            </tr>
            <tr>
                <td>
                    {{ active_dice_sum }}
                </td>
            </tr>
        </table>
    </div>
        <table class="table-hover table-bordered text-center table-sm col-md-10">
            <tr>
                <th> Die Sides</th>
                <th> Die Status</th>
                <th> Roll Value</th>
                <th> Remove Die</th>
            </tr>
            {% for die in all_dice %}
                {% if die.active %}
                    {% if die.num_sides == 6 %}
                        <tr>
                            <td>D6 &nbsp;<img src="{% static '/images/dice/d6.png' %}" alt="D 6"></td>
                            <td><a href="{% url 'deactivate_die' die.id %}">
                                <button type="button" class="btn btn-success">Active</button>
                                </a>
                            </td>
                            <td> {{ die.roll_value }} </td>
                            <td><a href="{% url 'remove_die' die.id %}">
                            <button type="button" class="btn btn-danger">X</button>
                            </a>
                            </td>
                        </tr>
                    {% else %}
                        <tr>
                            <td>D {{ die.num_sides }}</td>
                            <td><a href="{% url 'deactivate_die' die.id %}">
                                <button type="button" class="btn btn-success">Active</button>
                                </a>
                            </td>
                            <td> {{ die.roll_value }} </td>
                            <td><a href="{% url 'remove_die' die.id %}">
                                <button type="button" class="btn btn-danger">X</button>
                                </a>
                            </td>
                        </tr>
                    {% endif %}
                {% else %}
                    <tr>
                        <td>D {{ die.num_sides }}</td>
                        <td><a href="{% url 'activate_die' die.id %}">
                            <button type="button" class="btn btn-secondary">Inactive</button>
                            </a>
                        <td> {{ die.roll_value }} </td>
                         <td><a href="{% url 'remove_die' die.id %}">
                        <button type="button" class="btn btn-danger">X</button>
                        </a>
                        </td>
                    </tr>
                {% endif %}
            {% endfor %}
        </table>
</div>

 {% endblock %}

Вы определяете блоки в базовых шаблонах {% block your_block_name %}{% endblock %} и использовать эти блоки в дочерних шаблонах. Пожалуйста, дайте мне знать, если у вас возникла ошибка или вы не поняли ответ. Также вам не нужно ничего устанавливать (например, jinja2). Django уже поддерживает эту функцию.

...