Контекст шаблона Django несколько представлений
Я запускаю Idios, приложение профиля , и я хотел бы сделать профили в моем приложении поверх idios (т. е. сохранить idios pip-устанавливаемым, не изменяя само приложение).
Проблема в том, что вид профиля записывается в приложении idios, используя объектно-ориентированный подход передачи контекстных переменных и отображения этого вида в шаблоне. Я хочу, чтобы вид профиля также включал список друзей пользователя, управляемый отдельным приложением друзей. Я получил доказательство концепции от просто импортируйте друзей в Idios и обновите контекст с помощью новой переменной friend_list, а также добавьте еще один блок шаблона для отображения списка друзей.
Итак, каков наилучший или наиболее разумный подход к объединению списка друзей и профиля без изменения приложения idios? Этот вопрос в основном является просьбой о помощи, чтобыдействительно понять систему MVT в Django сухим способом, который поддерживает многоразовые приложения.
3 ответа:
К счастью, упомянутое приложение использует представления на основе классов, и это преимущество, которое вы получаете от использования представлений на основе классов. Чтобы изменить контекст, вы просто создаете подкласс их вида профиля:
Yourapp/views.py
from idios.views import ProfileDetailView class MyProfileDetailView(ProfileDetailView): def get_context_data(self, **kwargs): context = super(MyProfileDetailView, self).get_context_data(**kwargs) # get the list of friends and store it in a new key in `context` return context
Затем просто переопределите urlpattern idios, используемый по умолчанию в вашем urls.py (нужно идти до того, как будут включены идиос urlpatterns) и указать его на свой подкласс вместо
Наконец, для переопределения шаблона idios использует создание
idios/whatever_template.html
файл в каталоге вашего проекта (или приложения)templates
. Скопируйте шаблон по умолчанию и измените его по желанию. Вам вообще не нужно прикасаться к первоисточнику, благодаря всем переопределениям, которые предоставляет Django.
Это можно сделать, создав подкласс класса
ProfileDetailView
из idios в приложении в вашем проекте, добавив дополнительный контекст для друзей этого пользователя. Что-то вроде этого:import idios.views class ProfileDetailView(idios.views.ProfileDetailView): def get_context_data(self, **kwargs): context = super(ProfileDetailView, self).get_context_data(**kwargs) context['friends'] = get_friends(self.page_user) # Or however it works return context
Затем вы можете использовать этот подкласс в качестве представления в своем проекте.
Если вы думаете, что можете включить друзей пользователя и в другие представления, сухим способом было бы создать тег пользовательского шаблона или фильтр. Тогда вам просто нужно будет переопределить шаблон и включить в него тег/фильтр шаблона.
Если вы хотите только отобразить друзей пользователя в этом конкретном представлении, то я бы переопределил
get_context_data
, как описано в других ответах.