Форум сайта python.su
Приветствую. Изучаю Django в течении месяца и никак не могу справится с одной неувязкой.
Как я понял django пропагандирует слабую связанность => каждый функционал на сайта по-идее должен быть выполнен в отдельном reusable app. Это понятно и хорошо, т.к. позволяет работать с каждой частью независимо. Но! Когда нужно будет собрать все воедино, я не представляю себе как это сделать. Вот пример:
App отвечает за загрузку/выгрузку изображений и файлов на сайт (галерея и файл броузер). У него есть свои urls и views, где можно ходить по галереям, смотреть картинки и броузить файлы. И есть другое app по типу flatpages (просто страницы на сайте). Как их между собой интегрировать? Допустим надо вставить изображения на страницу с контентом, но не просто изображение а галерею картинок (которая затем будет прокручиваться на javascript в dive). Я не совсем представляю как это сделать. Писать код галереи прямо во flatpage? Не слишком разумно.
Второй вопрос: Как формировать ссылки на flatpages динамически? Я что-то читал про get_absolute_url() но немного не понял идеи. Что если на сайте много разделов и на каждый раздел надо оформить блок ссылок, т.е. как построить навигацию? Видел один подход - app который занимается формированием дерева ссылок (в админке создаешь список) а потом с помощью кастомного тега выводишь его в шаблоне. Я подозреваю что есть вариант делать тоже самое в каждой вюшке, т.е. формировать блоки какие нужно непосредственно перед выводом в шаблон, но тогда если изменится структура, то придется менять и view и шаблон.
Простите что так сумбурно, надеюсь на ваше понимание.
Спасибо
Офлайн
У вас есть два приложения например gallery и flatpages, соответственно в проекте есть их папки.
Теперь вам надо использовать модель из gallery в flatpages, для этого вы в коде (например во view) пишите:
...
from gallery.models import *
...
class ImageModel(Model):
...
def get_absolute_url(self):
return '/image_page/%d' % (self.id)
Отредактировано (Сен. 20, 2010 08:16:55)
Офлайн
Спасибо за ответ. Тем не менее если я возьму модель из галереи и воткну в страницы (во вью) то я не смогу вытащить галерею тк мне нужна будет какая то связь (id галереи). Опять же как в админке когда я добавляю страницу прямо в нее встроить галереи (если их требуется несколько)? Тоесть шаблон страницы генерировать на лету что ли?
С урл тоже проблема! В примере в модель зашит шаблон урл, а по идее должен определяться в одном месте в urlconf.
И таких вопросов по взаимодействию разных приложений очень много и не понятно как собрать этот борщ воедино с учетом того что не хочется делать одно большое приложение.
Офлайн
В главный urlconf ты подтягиваешь (импортируешь) все urlconf своих проложения… И каша приобретает вид чего-то вкусненького)
Офлайн
Нa уровнe приложeния урл зaшит в 2х мeстaх. Тоeсть борщ.
Офлайн
VolttКонечно нужна какая-то связь, или вы собрались делать приложение телепата? Самое очевидное это в модели галереи сделать ForeignKey на модель страницы и уже стандартными средствами вытягивать галереи в шаблоне через модель страницы.
Тем не менее если я возьму модель из галереи и воткну в страницы (во вью) то я не смогу вытащить галерею тк мне нужна будет какая то связь (id галереи). Опять же как в админке когда я добавляю страницу прямо в нее встроить галереи (если их требуется несколько)? Тоесть шаблон страницы генерировать на лету что ли?
VolttМожно указывать урл через имя представления (view) с помощью функции django.core.urlresolvers.reverse, если вам так больше нравится, но не забываем мантру “Очевидное лучше неочевидного”.
С урл тоже проблема! В примере в модель зашит шаблон урл, а по идее должен определяться в одном месте в urlconf.
VolttВ общем, вам нужно почитать ещё учебников или доков с мануалами, ибо вы плохо представляете себе общую структуру и работу Django.
И таких вопросов по взаимодействию разных приложений очень много и не понятно как собрать этот борщ воедино с учетом того что не хочется делать одно большое приложение.
Отредактировано (Сен. 20, 2010 23:12:17)
Офлайн
fthНаверное правильнее вытягивать галереи во вью через модель страницы, а потом вставлять в шаблон. Хотя в шаблон тоже можно, если метод определить соответствующий. Видимо я просто к словам придираюсь… :)
Самое очевидное это в модели галереи сделать ForeignKey на модель страницы и уже стандартными средствами вытягивать галереи в шаблоне через модель страницы.
fthА можно обернуть функцию get_absolute_url в декоратор permalink.
Можно указывать урл через имя представления (view) с помощью функции django.core.urlresolvers.reverse, если вам так больше нравится, но не забываем мантру “Очевидное лучше неочевидного”.
fthЧитаю уже не первый месяц, но как то понимания не приходит. Во многих книгах есть примеры приложений, но они почему то как раз противоречат философии django. Они пытаются вобрать в себя весь функционал, хотя кажется более логичным разделить его на независимые.
В общем, вам нужно почитать ещё учебников или доков с мануалами, ибо вы плохо представляете себе общую структуру и работу Django.
Отредактировано (Сен. 21, 2010 19:52:37)
Офлайн
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 %}
VolttСамый лучший способ учиться, это делать, чем серьёзней проект, тем лучше, сужу по своему опыту. =)
Читаю уже не первый месяц, но как то понимания не приходит. Во многих книгах есть примеры приложений, но они почему то как раз противоречат философии django. Они пытаются вобрать в себя весь функционал, хотя кажется более логичным разделить его на независимые.
Офлайн
согласен. Референс мануал в случае с джанго оказывается куда полезнее. Спасибо еще раз.
Да, а как сократить количество запросов в таком случае? Готовить список во вью заранее?
Офлайн
По идее select_related должно помочь.
Т.е. заменяем:
Page.objects.get(id =1)
На:
Page.objects.select_related(depth=1).get(id =1)
Но в этом вопросе я неуверен…
Отредактировано (Сен. 22, 2010 09:16:44)
Офлайн