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))
Вернуться на верх