Контекст шаблона Django несколько представлений


Я запускаю Idios, приложение профиля , и я хотел бы сделать профили в моем приложении поверх idios (т. е. сохранить idios pip-устанавливаемым, не изменяя само приложение).

Проблема в том, что вид профиля записывается в приложении idios, используя объектно-ориентированный подход передачи контекстных переменных и отображения этого вида в шаблоне. Я хочу, чтобы вид профиля также включал список друзей пользователя, управляемый отдельным приложением друзей. Я получил доказательство концепции от просто импортируйте друзей в Idios и обновите контекст с помощью новой переменной friend_list, а также добавьте еще один блок шаблона для отображения списка друзей.

Итак, каков наилучший или наиболее разумный подход к объединению списка друзей и профиля без изменения приложения idios? Этот вопрос в основном является просьбой о помощи, чтобыдействительно понять систему MVT в Django сухим способом, который поддерживает многоразовые приложения.

3 3

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, как описано в других ответах.