Найти - Пользователи
Полная версия: метод модели+@register.simple_tag+safe
Начало » Django » метод модели+@register.simple_tag+safe
1 2
Evg
Есть модель:
from django import template
register = template.Library()
class Profile(models.Model):

@register.simple_tag
def profile_image(profile):
return "<a href="+profile.url()+"><img src="+profile.url_mini_foto()+' border="0" width="20" height="20"/></a>'
далее в шаблоне
{{.profile_image|safe }}
без фильтра safe выдается экранированный хтмл, можно как нибудь сказать django о том что не нужно экранировать при описании тега?, что бы в шаблоне просто писать {{.profile_image }}
Александр Кошелев
Возвращать из тега нужно сразу SafeString. Но лучше так не делать, это менее наглядно и не говорит о намерениях автору шаблона.
Александр Кошелев
Ну и конечно тег как атрибут модели - это полный моветон.
Evg
Daevaorn
Ну и конечно тег как атрибут модели - это полный моветон.
ну если на то пошло, тогда и get_absolute_url в модели тоже моветон. ;)

зачем в модели информация о урлах и о шаблонах.
Александр Кошелев
Evg
ну если на то пошло, тогда и get_absolute_url в модели тоже моветон. wink

зачем в модели информация о урлах и о шаблонах.
Бррр… нет, нет и нет. Совершенно не так.

У объекта должен быть идентификатор и он этот идентификатор знать. Уж так сложилось, что для веб-приложений этот идентификатор - урл. Поэтому вполне естественно, что модель может если надо построить и вернуть свой урл-идентификатор.

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

Так что всё-таки странный и совершенно не правильный код.
Ferroman
Поддерживаю.
Перетягивание отображения в модель - противоречит принципу MVC.
Evg
Daevaorn
У объекта должен быть идентификатор и он этот идентификатор знать. Уж так сложилось, что для веб-приложений этот идентификатор - урл. Поэтому вполне естественно, что модель может если надо построить и вернуть свой урл-идентификатор.
- Не факт что для каждой модели урл нужен для каждой модели, могут быть модели для которых урл совершенно бесмыслен.
в идеале мне кажется более правильным чтобы модель вообще не знала о урл, и о том как ее отображают, у нее есть идентификатор id и не нужно больше никаких к ней примешивать лишних данных - пусть модель просто хранит данные и все. Можно теоретически представить что модели нужно будет переиспользовать вообще не в вебе, к чему там урлы?

Daevaorn
В то же время ваш “тег” мало того, что шаблонной, так ещё абсолютно бессмылен как таковой
Что значит он бесмысле как таковой? в контексте модели он имеет вполне определенный смысл - отобразить ее содержимое.
Я точно так могу утвержлать что так уж сложилось что в вебе есть шаблоны в виде html, и каждый объект должен себя представлять, а так как аватар имеет прямую связь с профайлом юзера которого он предоставляет то почему бы его не прилепить к контексту объекта модели профайла, урл объекта точно так связан с моделью как и ее представление, в любом случае если информация связана только с моделью я не вижу ничего страшного чтобы вносить ее в модель.


Еще мне кажется это удобным просто потому что мне не нужно грузить отдельный тег через {% load avatar%}
и потом делать {% avatar profile %}, а просто делать через {{profile.draw_avatar}}.
/
Evg
Ferroman
Поддерживаю.
Перетягивание отображения в модель - противоречит принципу MVC.
а я с этим и не спорю) просто это бывает удобно и все
Александр Кошелев
Evg
- Не факт что для каждой модели урл нужен для каждой модели, могут быть модели для которых урл совершенно бесмыслен.
При этом для других он нужен, а тут вы его просто не напишете. Обычное дело.
Evg
в идеале мне кажется более правильным чтобы модель вообще не знала о урл, и о том как ее отображают, у нее есть идентификатор id и не нужно больше никаких к ней примешивать лишних данных - пусть модель просто хранит данные и все. Можно теоретически представить что модели нужно будет переиспользовать вообще не в вебе, к чему там урлы?
Тут вы путает строку в базе данных и ресурс. Первое адресуется через id (причем это условно, если говорить про полную адресацию, то в ней еще и хост где БД, название самой БД и название таблицы), второе же через урл. Модель в большинстве случаев ресурс, поэтому знает как построить её идентификатор. А поскольку Джанга веб-фреймворк, то ресурсы именно через урлы адресуются, как бы вам это не нравилось.
Evg
Что значит он бесмысле как таковой? в контексте модели он имеет вполне определенный смысл - отобразить ее содержимое.
Создается впечатление, что вы сами не поняли, какой код вы написали.

Для того чтобы вызвать методы модели из шаблонов не надо их заворачивать в @register.simple_tag. Если вы это сделали, то получили шаблонный тег, который абсолютно бесполезен.
Evg
Evg
При этом для других он нужен, а тут вы его просто не напишете. Обычное дело.
Напишу именно там если нужен) просто какой смысл иметь ссылки например на записи которые хранят записи о том голосвал юзер или нет, кто их будет просматривать по урлам - они нужны для внутреннего использования и все. какой смысл тут урлы имеют?

Daevaorn
Тут вы путает строку в базе данных и ресурс. Первое адресуется через id (причем это условно, если говорить про полную адресацию, то в ней еще и хост где БД, название самой БД и название таблицы)
Вообще я имел ввиду не то и не другое, я имел ввиду больше понятие сущности - а не то как она конкретно хранится в базе там или еще как, а именно сущность и ее идентифкатор относительно других сущностей. Кстати помоему джанговская модель это и подразумевает тк не разу не видел чтобы из модели можно было вытягивать информацию о базе. От модели можно узнать именно о сущности а не о деталях ее реализации.

Daevaorn
Модель в большинстве случаев ресурс, поэтому знает она знает как построить её идентификатор. А поскольку джанаг веб фреймворк, то ресурсы именно через урлы адресуются, как бы вам это нравилось.
Что за ресурс такой первый раз слышу)? дайте определение), обычно этот самый урл ведет на страницу в которой кроме html описания самой модели содержится еще куча всякой инфомрации - вся хтмл страница. И то что этот урл уж так сильо относится к модели это еще большой вопрос. В любом случае я не знаю какой смысл вкладывали авторы в модель поэтому спорить не буду) Но то что это противоречит принципу ортогональности и тут можно и нужно разделять помоему очевидно.



Daevaorn
Создается впечатление, что вы сами не поняли, какой код вы написали.
Так и есть)) сейчас понял что можно обойтись и без @register.simple_tag, а просто вернуть SafeString.
Просто пертянул его от тега и забыл убрать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB