2011-12-30 3 views
3

Я запускаю Idios, a profile app, и я хотел бы сделать профили в моем приложении поверх idios (т. Е. Сохранить idios pip-installable, без изменения самого приложения).Django template context multiple views

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

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

ответ

2

К счастью, упомянутое приложение использует представления на основе классов, и это преимущество, которое вы получаете от использования представлений на основе классов. Чтобы изменить контекст, вы просто создать подкласс их вида профиля:

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 (потребности идти до idios urlpatterns включены) и указать его к подклассу вместо

Наконец, чтобы переопределить idios шаблона использует, создавая idios/whatever_template.html файл (или приложение) templates директории вашего проекта. Скопируйте шаблон по умолчанию и измените его по своему усмотрению. Вам вообще не нужно прикоснуться к исходному источнику, благодаря всем переопределениям Django.

+0

Отлично, вы оба очень много помогли, это описание имеет более подробную информацию, поэтому я выбрал его, но этого будет достаточно. Я знал, что есть преимущество объектно-ориентированного подхода, и это было так просто, что я не мог его увидеть: наследование класса! – wrought

+0

О, и я просто реализовал его таким образом, отлично работал. – wrought

1

Вы должны сделать это, создав подкласс класса 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 

Затем вы можете использовать этот подкласс в качестве своего проекта.

0

Если вы считаете, что можете включить друзей пользователя в другие виды, то сухим способом было бы создать custom template tag or filter. Тогда вам просто придется переопределить шаблон и включить там тег/фильтр.

Если вы хотите показывать только друзей пользователя в этом конкретном представлении, я бы переопределил get_context_data, как описано в других ответах.

+0

Хорошая мысль, я полагаю, что вопрос был поставлен, вышеупомянутые решения были достаточными. Однако ваш метод Super-DRY имеет смысл. – wrought

+0

Вышеупомянутый способ хорош, потому что мне нужно создать другие изменения в приложении профиля idios, и поэтому я просто сделаю все это в своем собственном приложении, создав представления подкласса и т. П. Следующий шаг (который я добавлю в качестве проблемы) - еще больше абстрагировать взгляды друзей для использования в нескольких приложениях, а не только в профиле idios. – wrought