Как правильно вытащить из базы данных используя Django и шаблоны тегов - PullRequest
0 голосов
/ 03 апреля 2019

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

Я раньше не использовал Django, поэтому я не уверен, правильно ли я это делаю,В настоящее время я пишу скрипт для извлечения из базы данных и отображения на html-странице, на которой он должен отображаться при использовании файла python для хранения тега шаблона Django.Я пробовал прежде, чем просто извлечь данные из базы данных из файла html, но не смог, поскольку мне нужно было импортировать библиотеки моделей django, и я не смог сделать это в html.

У меня есть код, разделенный на две части.Сценарий, выполняющий запрос, находится в моем шаблоне тега с меткой DatabaseQueryScript, который выглядит следующим образом:

@register.filter(name='PullEmployees')
  def PullEmployeesFromDatabase():
    AllEmployees = Profile.objects.all()
    return AllEmployees

Затем я вызываю функцию в html-файле

{% load DatabaseQueryScript %}
{%for employee in PullEmployees%}
 ```printing data to a table on screen```
{%endfor%}

Я ожидаю, что смогучтобы увидеть список сотрудников на столе, когда я открываю страницу, но сейчас в таблице нет ничего, кроме заголовка, который я добавил перед выполнением запроса.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Вы не должны делать это внутри шаблонных фильтров или шаблонных тегов.Они существуют для изменения поведения шаблона или для внесения изменений в данные, уже переданные в шаблон.

Вы захотите запрашивать базу данных из своего поля зрения.Вы можете использовать соответствующий общий вид на основе классов, в данном случае ListView, или добавить его в свой контекст.

Использовать ListView следующим образом:

from django.views.generic.list import ListView

class ListAllEmployees(ListView):
  model = Profile

Затем в своем шаблоне вы можетеПереберите все ваши «Профили», например, с помощью {% for profile in object_list %}.

Или вы можете добавить его в свой контекст, который передаст его шаблону:

from django.views.generic import TemplateView

class ListAllEmployees(TemplateView):
  def get_context_data(self):
    ctx = super().get_context_data()
    ctx['profiles'] = Profile.objects.all()
    return ctx

И затем вы можете повторить это в своем шаблоне, например: {% for profile in profiles %}.

1 голос
/ 03 апреля 2019

К сожалению, похоже, вы неправильно поняли, как использовать шаблонные фильтры Django. Фильтр - это то, что вы используете для изменения или взаимодействия с объектом.

Если вы посмотрите на существующие встроенные фильтры, вы можете найти несколько примеров .

1007 * Е.Г. *

{{value|capfirst}}  # Converts a string stored in value, to be capitalized.

В вашем конкретном случае вы, вероятно, просто хотите добавить список элементов базы данных в контекст вашего шаблона. Есть несколько способов сделать это в зависимости от того, используете ли вы функциональные представления или представления на основе классов.

Когда вы, наконец, определили переменную в своем контексте, вы можете просто сделать следующее (где object_list - это пример имени переменной контекста).

{% for obj in object_list %}

Представление списка на основе классов

from django.views.generic import ListView
class EmployeeListView(ListView):
    model = Employee
    template = "/mytemplate.html"

В этом случае ListView автоматически добавит всех сотрудников в переменную шаблона с именем object_list.

Переопределить get_context_data

Если вы не используете ListView или не хотите полагаться на унаследованную автоматизацию создания списка объектов, вы можете переопределить метод get_context_data() в своем общем представлении.

from django.views.generic import TemplateView
class EmployeeView(TemplateView):
    template = "/mytemplate.html"

    def get_context_data(self):
        context = super().get_context_data()
        context["employee_list"] = self.get_queryset()
        return context

    def get_queryset(self):
        return Profile.objects.all()

Использование функциональных представлений

В случае функциональных представлений вы просто передадите контекст в качестве kwarg вашей функции рендеринга.

def employee_view(request):
    return render(request, '/mytemplate.html', {'employee_list': get_queryset()})

def get_queryset():
    return Profile.objects.all()
...