Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Взаимодействие приложений (как писать для django) [RSS Feed]

#1 Сен. 20, 2010 06:50:05

Voltt
От:
Зарегистрирован: 2010-09-20
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

Приветствую. Изучаю Django в течении месяца и никак не могу справится с одной неувязкой.

Как я понял django пропагандирует слабую связанность => каждый функционал на сайта по-идее должен быть выполнен в отдельном reusable app. Это понятно и хорошо, т.к. позволяет работать с каждой частью независимо. Но! Когда нужно будет собрать все воедино, я не представляю себе как это сделать. Вот пример:

App отвечает за загрузку/выгрузку изображений и файлов на сайт (галерея и файл броузер). У него есть свои urls и views, где можно ходить по галереям, смотреть картинки и броузить файлы. И есть другое app по типу flatpages (просто страницы на сайте). Как их между собой интегрировать? Допустим надо вставить изображения на страницу с контентом, но не просто изображение а галерею картинок (которая затем будет прокручиваться на javascript в dive). Я не совсем представляю как это сделать. Писать код галереи прямо во flatpage? Не слишком разумно.

Второй вопрос: Как формировать ссылки на flatpages динамически? Я что-то читал про get_absolute_url() но немного не понял идеи. Что если на сайте много разделов и на каждый раздел надо оформить блок ссылок, т.е. как построить навигацию? Видел один подход - app который занимается формированием дерева ссылок (в админке создаешь список) а потом с помощью кастомного тега выводишь его в шаблоне. Я подозреваю что есть вариант делать тоже самое в каждой вюшке, т.е. формировать блоки какие нужно непосредственно перед выводом в шаблон, но тогда если изменится структура, то придется менять и view и шаблон.

Простите что так сумбурно, надеюсь на ваше понимание.

Спасибо



Офлайн

#2 Сен. 20, 2010 08:16:09

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

У вас есть два приложения например gallery и flatpages, соответственно в проекте есть их папки.
Теперь вам надо использовать модель из gallery в flatpages, для этого вы в коде (например во view) пишите:

...
from gallery.models import *
...
И всё, вы можете абсолютно свободно использовать ранее написанное. (так можно проделывать с абсолютно любым модулем, хоть вообще из другого проекта)

Пишите функцию модели возвращающую url в строковом виде и всё. Называть можно абсолютно по разному, но принято get_absolute_url() (плюс в этом случае будет интеграция с админкой)
class ImageModel(Model):
...

def get_absolute_url(self):
return '/image_page/%d' % (self.id)
Т.е. ничего особого в этой функции нет, их можно писать сколько душе угодно.



Отредактировано (Сен. 20, 2010 08:16:55)

Офлайн

#3 Сен. 20, 2010 10:16:26

Voltt
От:
Зарегистрирован: 2010-09-20
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

Спасибо за ответ. Тем не менее если я возьму модель из галереи и воткну в страницы (во вью) то я не смогу вытащить галерею тк мне нужна будет какая то связь (id галереи). Опять же как в админке когда я добавляю страницу прямо в нее встроить галереи (если их требуется несколько)? Тоесть шаблон страницы генерировать на лету что ли?

С урл тоже проблема! В примере в модель зашит шаблон урл, а по идее должен определяться в одном месте в urlconf.

И таких вопросов по взаимодействию разных приложений очень много и не понятно как собрать этот борщ воедино с учетом того что не хочется делать одно большое приложение.



Офлайн

#4 Сен. 20, 2010 11:10:00

vaxXxa
От: Kyiv, Ukraine
Зарегистрирован: 2009-06-16
Сообщения: 278
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

В главный urlconf ты подтягиваешь (импортируешь) все urlconf своих проложения… И каша приобретает вид чего-то вкусненького)



Офлайн

#5 Сен. 20, 2010 13:14:50

Voltt
От:
Зарегистрирован: 2010-09-20
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

Нa уровнe приложeния урл зaшит в 2х мeстaх. Тоeсть борщ.



Офлайн

#6 Сен. 20, 2010 20:50:34

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

Voltt
Тем не менее если я возьму модель из галереи и воткну в страницы (во вью) то я не смогу вытащить галерею тк мне нужна будет какая то связь (id галереи). Опять же как в админке когда я добавляю страницу прямо в нее встроить галереи (если их требуется несколько)? Тоесть шаблон страницы генерировать на лету что ли?
Конечно нужна какая-то связь, или вы собрались делать приложение телепата? Самое очевидное это в модели галереи сделать ForeignKey на модель страницы и уже стандартными средствами вытягивать галереи в шаблоне через модель страницы.

Voltt
С урл тоже проблема! В примере в модель зашит шаблон урл, а по идее должен определяться в одном месте в urlconf.
Можно указывать урл через имя представления (view) с помощью функции django.core.urlresolvers.reverse, если вам так больше нравится, но не забываем мантру “Очевидное лучше неочевидного”.

Voltt
И таких вопросов по взаимодействию разных приложений очень много и не понятно как собрать этот борщ воедино с учетом того что не хочется делать одно большое приложение.
В общем, вам нужно почитать ещё учебников или доков с мануалами, ибо вы плохо представляете себе общую структуру и работу Django.

P.S.: За время моего недолгого знакомства с Джангой я усвоил простую истину: “Если у тебя получается что-то криво, то с большой вероятностью ты делаешь это неправильно”



Отредактировано (Сен. 20, 2010 23:12:17)

Офлайн

#7 Сен. 21, 2010 19:43:27

Voltt
От:
Зарегистрирован: 2010-09-20
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

fth
Самое очевидное это в модели галереи сделать ForeignKey на модель страницы и уже стандартными средствами вытягивать галереи в шаблоне через модель страницы.
Наверное правильнее вытягивать галереи во вью через модель страницы, а потом вставлять в шаблон. Хотя в шаблон тоже можно, если метод определить соответствующий. Видимо я просто к словам придираюсь… :)

fth
Можно указывать урл через имя представления (view) с помощью функции django.core.urlresolvers.reverse, если вам так больше нравится, но не забываем мантру “Очевидное лучше неочевидного”.
А можно обернуть функцию get_absolute_url в декоратор permalink.

fth
В общем, вам нужно почитать ещё учебников или доков с мануалами, ибо вы плохо представляете себе общую структуру и работу Django.
Читаю уже не первый месяц, но как то понимания не приходит. Во многих книгах есть примеры приложений, но они почему то как раз противоречат философии django. Они пытаются вобрать в себя весь функционал, хотя кажется более логичным разделить его на независимые.

И да, общую структуру и работу django я как раз хорошо понимаю. Дело в деталях. Мало опыта реализации приложений в таком ключе.

Спасибо за дельные советы в любом случае!



Отредактировано (Сен. 21, 2010 19:52:37)

Офлайн

#8 Сен. 21, 2010 23:01:21

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

Voltt
Наверное правильнее вытягивать галереи во вью через модель страницы, а потом вставлять в шаблон. Хотя в шаблон тоже можно, если метод определить соответствующий
Шаблонная система позволяет делать вот так:
#model
class Page(Model):
name = CharField()

class Image(Model):
page = ForeignKey(Page, related_name='galleries')
#view
return render_to_response('page.html', {'page': Page.objects.get(id =1)})
# template
{% for gallery in page.galleries %}
<li>{{ gallery }}</li>
{% endfor %}
Т.е. в шаблон передаётся только модель страницы и ничего более, всё остальное делает шаблонная система. (хотя, такое небрежное отношение может отрицательно сказаться на количестве SQL запросов)

Voltt
Читаю уже не первый месяц, но как то понимания не приходит. Во многих книгах есть примеры приложений, но они почему то как раз противоречат философии django. Они пытаются вобрать в себя весь функционал, хотя кажется более логичным разделить его на независимые.
Самый лучший способ учиться, это делать, чем серьёзней проект, тем лучше, сужу по своему опыту. =)
А учебникам полностью верить не стоит. (лично я не читал всего две книги, да и то не полностью))



Офлайн

#9 Сен. 22, 2010 07:10:40

Voltt
От:
Зарегистрирован: 2010-09-20
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

согласен. Референс мануал в случае с джанго оказывается куда полезнее. Спасибо еще раз.

Да, а как сократить количество запросов в таком случае? Готовить список во вью заранее?



Офлайн

#10 Сен. 22, 2010 09:09:42

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие приложений (как писать для django)

По идее select_related должно помочь.
Т.е. заменяем:
Page.objects.get(id =1)
На:
Page.objects.select_related(depth=1).get(id =1)

Но в этом вопросе я неуверен…



Отредактировано (Сен. 22, 2010 09:16:44)

Офлайн

  • Начало
  • » Django
  • » Взаимодействие приложений (как писать для django)[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version