Django: Как расширить одну и ту же функциональность на многие представления?
У меня есть родительский шаблон, который я использую во многих частях сайта, который называется base.html
, Этот шаблон содержит множество функциональных компонентов, таких как кнопки, которые запускают различные формы (внутри модальных окон), позволяя пользователям загружать различные виды контента, и т. Д. Я хочу, чтобы пользователи могли нажимать эти кнопки практически из любой части сайта (из всех шаблонов, которые наследуют от base.html
).
Я написал вид, который обрабатывает главную страницу сайта, HomeView
(это делает homepage.html
, который наследует от base.html
). Я добавил кучу функциональных возможностей в это представление, которое обрабатывает все загрузки.
Поскольку многие шаблоны будут наследоваться от base.html
и, следовательно, имеют все те же функции, я должен скопировать и вставить сотни строк кода из HomeView
в представлениях, которые делают все остальные страницы??
Должен быть лучший способ, верно?
Как убедиться, что функциональность родительского базового шаблона сохраняется для всех представлений, которые вызывают дочерние шаблоны, которые наследуются от этого базового шаблона?
5 ответов
Вы можете поместить все строки кода из HomeView
в отдельной функции пусть будет func
и имеют func
вернуть словарь, содержащий все переменные контекста, необходимые
и называть это всякий раз, когда нужно, чтобы ваш HomeView
будет выглядеть так:
def HomeView(request):
dict = func(request)
... # rest of code that is not common with other views
и ваш func
будет выглядеть так:
def func(request):
#all repeated code
#put all needed variables in a dictionary and return it
dict = {'var1': 4, 'var2': "a String" ...}
return dict
Загрузите функциональную часть с помощью ajax в ваш base.html.
Таким образом, у вас есть view_method, который имеет дело исключительно с этими функциями.
Вы можете отображать множество шаблонов в одном представлении, требуя уникального значения в каждом сеансе или использовать запрос.
использование
TemplateResponse
вместоHttpResponse
вhome_view
, Таким образом, вы сможете обновить контекст и переключить шаблон в ответе.Вызов
home_view
внутри других взглядов, как это:from django.template.response import TemplateResponse def other_view( request ): #produce other_context t = home_view( request ) t.context.update( other_context ) t.template = 'other_template.html' return t
Я считаю, что разделение функций, связанных с загрузкой, на отдельные представления будет лучшим способом решения этой проблемы. Таким образом, все ваши шаблоны (наследуя от base.html
) будет ссылаться на соответствующий вид для загрузки.
Ты можешь использовать HTTP_REFERER
заголовок для перенаправления на соответствующую страницу из представлений загрузки.