9 декабря 2008 г.

Создание блочной структуры, выборка блока по маске в зависимости от текущего url в django

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

Чтобы было понятнее, логика обратная следующей

Block.objects.get(path_mask__contains='url')

Здесь идет поиск по полю path_mask, содержащему 'url'.
Нам же надо найти объект, для которого значение 'url', содежит path_mask.

Код для регистрации inclusion_tag

import re

@register.inclusion_tag("show_block.html")
def show_left_blocks(url):
blocks = Block.objects.filter(column="left", active=True)
blocks_out = []
for block in blocks:
path_r=re.compile(block.path_mask)#создаем регулярное выражение
if path_r.search(url): #ищем в строке url совпадение
blocks_out.append(block) #если есть совпадение - добавляем блок
return {'blocks': blocks_out}


Минусы:
-приходится запрашивать все блоки, поиск идет на уровне приложения а не базы
(в принципе не особо критично, т.к. блоков даже в крупных проектах не сотни тысяч)

ps. Может я просмотрел, и джанго может сама выполнять данную работу на уровне базы?

8 декабря 2008 г.

Прерывание перехода по ссылке "#" в javascript

Переход по ссылке при обработке ее яваскриптом нам не нужен. Например, при:

link

Почему не нужен? Потому что в адресной строке # нам ни к чему, плюс некоторые браузеры (фаерфокс, ie) выполняют переход по новой ссылке без перезагрузки страницы, что приводит по крайней мере к потере позиции скроллинга страницы.
Посему возвращаем false , тем самым прерывая переход по ссылке:

link

Немного разобрался с созданием форм из моделей

Думал раньше, что если instance содержит данные, значит редактирование, если нет, значит новая запись.
Однако это еще не все. Должна быть data:

f = Form(data=request.POST, instance=a)

Именно поэтому в инете очень много вопросов, почему при создании формы из модели при существующем instance не проходит валидация формы, да потому что данных для валидации при единственном instance на самом деле нет.

О чем я начал тему: http://softwaremaniacs.org/forum/django/7303/

2 декабря 2008 г.

Два formset'а в одном виде, дополнительное отображение

Все задачи без детального продумывания и без идеального знания Питона (или Пайтона).
Это скорее заметки для себя, а не руководство.


Первая ласточка: есть поле manytomany с аргументом through

class Person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()

Надо сделать одновременную форму для редактирования Группы и Членства для персоны.
И Членство для Персоны может быть не одно.
Считая, что у нас есть инстанс персоны, создаем два формсета (можно использовать inline_formset для каждого, а можно не использовать, нет разницы, по-моему (лишь использование instance вместо queryset, чего можно добиться просто изменив запрос):

Как создаются формсеты рассказывать не буду. В документации все подробно расписано. Будем создавать формсет на основе модели.
Итого: у нас два одинаковых формсета (в одном Членство, в другом Группа для этого членства). Но нам надо редактировать каждую форму данных формсетов вместе.

Вот простое решение как подружить два формсета, плюс добавить в счетчик.
Добавляем во view:

class MergeForm(object):
def __init__(self, groupform, memebershipform,index):
self.groupform=groupform
self.memebershipform=memebershipform
self.index=index

output=[]
idx=0

for group_form in groupformset.forms:
memebership_form=memebershipformset.forms[idx]
output.append(MergeForm(group_form, memebership_form, idx+1))
idx+=1

Передаем в render_to_response два формсета и наш объект output.

Ну а управление дополнительными формами я планирую вести с помощью jquery

24 ноября 2008 г.

Django

Начал тут работать с сабжем. Очень понравилось.
Если будет желание и время, опубликую не очевидные, но приятные решения. Хотя сам сейчас такие ищу в инете и разбираюсь.

Какая же дрянь эта sape.ru, setlinks.ru рулит

Сабж, почему все на него лезут - не понимаю.
Недавно зарегился снова...
Почему снова? Да потому что где-то около года назад хотел воспользоваться. Зарегистрировался, пока настроил, дождался ссылок. когда пришли ссылки, решил зайти в интерфейс, что-то поправить (уже не помню) - а вот фиг вам! Не пускает! Проныкался месяца два - писал в техподдержку и на форум - ничего не сделали.

Так вот, зарегился снова (думал может исправились). Оформил площадку, странички берутся из индекса Яндекса (это сразу насторожило). Ну ладно думаю, пускай. Оформил все - странички в ОК, с пятницы по понедельник ждал модерации (у них модерация, да еще и с выходными - о, 21 век!). Дождался - "не прошел модерацию".
Почему, зачем?
Логика нормального человека - извещения (ну думаю тут должно быть что-то написано) - неа, пусто.
Потыкал на площадку - никаких комментариве не нашел. Пошел в Faq. Там что-то по поводу яндекса. Если странички не в Яндексе - не примем. Но постойте? Вы же брали их откуда? Ну если сами индексировали зачем вам яндекс, а если брали с яндекса то в чем проблема?
Как проверить что страица в яндексе? - есть кнопочка около каждой страницы - по нажатии на нее - переход на линк с проверкой - если ли страница в индексе яндекса? Мухаха, даже на моем небольшом сайтике 2000 страниц, дануеенафиг)
Удалил, забыл как страшный сон. Да здравствует Сетлинк.

ps. С setlinks.ru ну никаких проблем (ну падал сервер недавно, ну и что, подняли починили, все хорошо, я даже не заметил ничего), видно что писали более менее адекватные программисты, с поддержкой общался - все на хорошем уровне.

7 августа 2008 г.

Понимание ценности человека

Пришла в голову мысль, что все очень сложно в этом мире. Ну это я знал конечно и до этого. А мысль очень простая. Есть человек, он так-то поступает и живет вот так-то. Так вот, ценности данного человека не в том, какой у него такой характер (назовем это так, в общем, имеется ввиду вся совокупность человека, не зависимая от человека, а зависимая от природы, от ген и т.п.), а в какую сторону и на сколько он смог его побороть. Исходя из этого, людям со скверным характером, стать понимающими и добрыми - намного труднее, чем со склонными к этому людьми. Соотвественно, это большая ценность, чем стать еще добрее и так доброму человеку. Ценность стала понятна, осталось выяснить а что дает нам эта ценность?