Как передать данные в инжектированный шаблон django?
В интерфейсе админки django у меня есть пользовательская вкладка для отображения таблицы. Как отобразить таблицу в виде списка таблиц модели django admin вместо поля, но при этом получить контекст для таблицы из admin.py, вызвав метод из модели. Я использовал baton_form_includes
django-baton для вставки шаблона под полем, но затем я не смог передать данные в этот шаблон.
models.py
class MyModel(TimeStampedModel):
.
.
.
def get_custom_tab_data(self):
return OtherModel.objects.filter(
active=False
)
admin.py
@admin.register(models.MyModel)
class MyModelAdmin():
.
.
.
readonly_fields = (
"get_custom_tab_data",
)
fieldsets = (
_("Custom Tab"),
{
"fields": ("get_custom_tab_data"),
"classes": ("tab-fs-custom")
}
)
.
.
# django-baton
baton_form_includes = [("admin/custom_tab_template.html", "get_custom_tab_data", "below")]
# This was the better solution but template table should display as model admin list with custom data, so had to use baton_form_includes to inject template above field.
# def custom_tab_data(self, myModel: models.MyModel):
# if myModel.active:
# return "N/A"
# if custom_data := myModel.get_custom_tab_data()[:15]: # get 15 latest
# html_content = render_to_string(
# "admin/custom_tab_template.html",
# {"custom_data": custom_data}
# )
# return mark_safe(html_content)
@admin.display(description="Custom Tab")
def get_custom_tab_data(self, myModel: models.MyModel):
return self.custom_tab_data(account)
custom_tab_template.html
{% load i18n l10n %}
<table class="table table-stripped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>State</th>
<th>Created</th>
</tr>
</thead>
<tbody>
{% comment %} {% for data in original.get_custom_tab_data|slice:"-15:" %} {% endcomment %}
{% for data in custom_data %}
<tr>
<th>{{ data.id }}</th>
<td>{{ data.name }}</td>
<td>{{ data.state }}</td>
<td>{{ data.created }}</td>
</tr>
{% empty %}
<tr>
<th>-</th>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
{% endfor %}
</tbody>
</table
views.py:
В представлении Django вы можете передавать данные в шаблон с помощью функции render.
from django.shortcuts import render
def my_view(request):
my_data = {'key1': 'value1', 'key2': 'value2'}
return render(request, 'my_template.html', {'my_data': my_data})
В этом примере my_data - это словарь, содержащий данные, которые вы хотите передать в шаблон. Ключи и значения в этом словаре будут доступны в шаблоне.
my_template.html:
Теперь в вашем шаблоне вы можете получить доступ к данным, используя ключи из словаря.
<!DOCTYPE html>
<html>
<head>
<title>My Template</title>
</head>
<body>
<h1>{{ my_data.key1 }}</h1>
<p>{{ my_data.key2 }}</p>
</body>
</html>
В этом шаблоне {{ my_data.key1 }} и {{ my_data.key2 }} будут заменены на соответствующие значения из словаря my_data.
Не забывайте использовать соответствующие шаблонные теги ({{ }} для переменных, {% %} для потока управления) при работе в шаблонах Django.