Заполнение шаблона Django переменными и данными базы данных? - PullRequest
0 голосов
/ 09 марта 2019

Я использую Django для создания приложения с разными типами слов / терминов. На одной странице у вас может быть заголовок «Условия», а затем список терминов. На другой странице у вас точно такая же вещь, но для фраз (заголовок, список фраз).

Можно ли сделать что-то подобное ->

  1. Заголовок магазина и список терминов
  2. Хранить заголовок и список фраз
  3. Создать один шаблон, который используется для отображения заголовков и списков на страница
  4. Вызовите некоторую функцию Django (не уверена, существует ли она), которая использует шаблон для генерации страницы для терминов
  5. Используйте тот же Джанго функция, которая использует тот же шаблон для создания страницы для фразы

Надежда состоит в том, что я могу избежать одной большой папки с шаблонами, заполненной страницами, которые в основном делают то же самое. Например, прямо сейчас, если бы я хотел добавить phrases_in_spanish и phrases_in_french, мне пришлось бы добавить два новых шаблона, которые в основном делают одно и то же -> показывая заголовок и список. Все, что я хочу сделать, это сохранить заголовок и список где-нибудь, а Django сделает всю остальную работу по созданию страниц. Таким образом, технически у меня может быть 1000 страниц без необходимости писать 1000 различных файлов шаблонов, которые просто показывают заголовки и списки.

Пример шаблона:

{% extends "profile/base.html" %}

{% block content %}

    <div class="row">
        <div class="col-sm-6">
            <a href="{% url 'profile:new_term' %}">Add a New Term</a>
            <p>Terms:</p>
            <ul>
                {% for term in terms %}
                    <li><p><a href="{% url 'profile:term' term.id %}">{{ term.name }}</a> : {{ term.definition }}</p></li>
                    <a href="{% url 'profile:edit_term' term.id %}">Edit Term</a>
                    <a href="{% url 'profile:delete_term' term.id %}">Delete Term</a>
                {% empty %}
                    <li>No terms have been added yet.</li>
                {% endfor %}
            </ul>
        </div>
    </div>
{% endblock content %}

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Вам не нужно создавать HTML-шаблон для каждой страницы.

Вы должны создать диспетчер URL на urls.py:

url(r'^(P<list_name>\w+)/$', views.your_view)

Таким образом, вместо множества шаблонов, имеющих одинаковую структуру, вы отображаете только один с нужной вам информацией.

Итак, ваше мнение должно выглядеть так:

def your_view(request, list_name):
    list = get_object_or_404(List, pk=list_name)
    context = {
        'list_info':list.info
    }
   return render(request, 'your_app/template.html', context)

Конечно, в этом примере вам нужно иметь таблицу с именем List в вашей базе данных с первичным ключом list_name.

1 голос
/ 09 марта 2019

Возможно, было бы возможно иметь модель под названием что-то общее, например Concept (это могут быть термины, фразы, заголовки или что-то похожее) со связанной моделью, такой как ConceptDetail (которая может быть списком терминов или списком. фраз и т. д.).

Тогда у вас есть одна конфигурация URL, но разные концепции имеют разные PK, которые появляются в URL, чтобы различать их (вы также можете использовать слагов в URL как kwargs, чтобы сделать URL более читабельными). Например:

path('concept/', ConceptListView.as_view()),
path('concept/<slug:concept_name>/', ConceptDetailView.as_view()),

Что касается представлений и шаблонов, у вас есть ListView, который показывает вам все концепции (здесь вы можете добавить фильтрацию и другие параметры поиска), а затем в DetailView каждой концепции вы можете отобразить связанные с ней экземпляры ConceptDetail.

Похоже ли это на то, что может вам помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...