Django Sitetree возвращает "expected str instance, LazyTitle found" в {% sitetree_page_title from menu %}
Django версия: 3.2.9 & 4.0.4 Python версия: 3.8.10 ОС: Ubuntu 20.04lts
У меня есть дерево сайтов, которое использует контекстную переменную в заголовке. При переходе по этому пути и загрузке шаблона с помощью {% sitetree_page_title from menu %} возвращается элемент последовательности 1: expected str instance, LazyTitle found.
Я не нашел информации именно по этому вопросу, но похоже, что при использовании контекстных данных в заголовке генерируется объект LazyTitle. Объект не преобразуется в строку, поэтому шаблонизатор бомбит.
Ниже я приведу соответствующий код. Я смог обойти эту проблему, отредактировав sitetreeapp.py и обернув возврат get_current_page_title() в str(), но это кажется чрезмерным.
Приложение, о котором идет речь, - это небольшое тестовое приложение, над которым я работаю, чтобы создать пример CRUD-приложения с функциями, необходимыми нашей компании. В нем нет ничего необычного. Приложение еще не завершено на 100%, поэтому если что-то выглядит не на своем месте, возможно, я еще не дошел до этого момента, но эта часть должна работать нормально.
Рассматриваемое дерево сайтов загружается динамически через метод config.ready. Пункты меню без контекстных переменных работают без проблем. Я проверил, что контекстная переменная, о которой идет речь, доступна в шаблоне. Надеюсь, это что-то простое, что я упускаю из виду. Любая помощь будет принята с благодарностью. Я также должен отметить, что, хотя я использовал StackOverflow в течение многих лет, я не писал много сообщений, поэтому, пожалуйста, простите мое форматирование сообщений.
sitetree.py - обратите внимание, что insert и list работают нормально
from sitetree.utils import tree, item
sitetrees = [[
# setup the base tree
tree('app_model_test', items=[
# Then define items and their children with `item` function.
item('App Test', 'test_app:app_test_home',
hint='Test CRUD App',
children=[
item('Search Results', 'test_app:app_test_list',
in_menu=False, in_sitetree=False),
item('Insert Record', 'test_app:app_test_insert',
hint="Insert a new record",
),
item('Update Record {{ object.ssn }}', 'test_app:app_test_update object.id',
in_menu=False, in_sitetree=False),
])
]),
], ]
urls.py
app_name = 'test_app'
urlpatterns = [
path('insert/', views.app_test_form, name='app_test_insert'),
path('update/<int:id>/', views.app_test_form, name='app_test_update'),
path('list/', views.appTestListView.as_view(), name='app_test_list'),
]
views.py - соответствующие части
def app_test_form(request, action='add', id=0):
if id > 0:
test_obj = get_object_or_404(appTestModel, id=id)
form = appTestForm(instance=test_obj)
if request.method == 'GET':
if id == 0:
form = appTestForm()
test_obj = None
else:
if id == 0:
form = appTestForm(request.POST)
if form.is_valid():
form.save()
return redirect('/list')
# this will have to be somewhere else and contain whatever app apps are
# installed to get all the menu entries
menus = ['app_model_test']
context = {'form': form,
'title': 'app Test',
'action': action,
'menus': menus,
'object': test_obj}
return render(request, 'CRUD_base.html', context)
dyn_tree_register.py
from sitetree.sitetreeapp import register_dynamic_trees, compose_dynamic_tree
from sitetree.utils import tree, item
from . import sitetree as app_test_tree
register_dynamic_trees(
[
compose_dynamic_tree(*app_test_tree.sitetrees),
],
# Line below tells sitetree to drop and recreate cache, so that all newly registered
# dynamic trees are rendered immediately.
reset_cache=True
)
apps.py
from django.apps import AppConfig
class AppModelTestConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app_model_test'
def ready(self):
from . import dyn_tree_register
и, наконец, соответствующая часть шаблона:
{% load sitetree %}
{% for menu in menus %}
<h1 class="title" id="page-title">{% sitetree_page_title from menu %}</h1>
{% endfor %}
Как я уже говорил, я могу заставить это работать, изменив sitetreeapp.py и обернув возврат get_current_page_title в str():
def get_current_page_title(self, tree_alias: str, context: Context) -> str:
"""Returns resolved from sitetree title for current page.
:param tree_alias:
:param context:
"""
return str(self.get_current_page_attr('title_resolved', tree_alias, context))