ФорумПрограммированиеPythonDjango → Вопросы о джанге и питоне от новичка

Вопросы о джанге и питоне от новичка

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 28 сентября 2015 г. 12:09

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

    Создал приложение content которое берет из базы записи типа [name, code, parent, content] и генерит для них url’ы

    вот я подключаю из /mysite/urls.py генератор урлов из приложения:

    
    urlpatterns = patterns('',
        url(r'^', include('content.urls', namespace='content'))
    )
    

    далее в /content/urls.py генерю сами урлы

    
    elements = ContentElements.objects.all()
    
    def buildUrl(el):
        path = el.code
        if el.parent:
            path = buildUrl(el.parent)+'/'+path
    
        return path
    
    for el in elements:
        path = buildUrl(el)
        urlpatterns.append(url(r'^'+path+'/$', views.show, name='content_'+el.code)) 
    

    В итоге получается примерно такая ебалайка:

    
    ^ ^test/$ [name='content_1_test']
    ^ ^test/test_content/$ [name='content_2_test_content']
    ^ ^bitrix/$ [name='content_3_bitrix']
    ^ ^bitrix/modules_generator/$ [name='content_4_modules_generator']
    

    Вроде все работает но жопой чувствую что-то сделал коряво. Сама регулярка какая-то уебищная получается. Как делать правильно?

    Второй вопрос больше из теории. Вот я открываю админку джанги, и добавляю в базу новую запись для приложения content. Пдалее пытаюсь открыть свежесозданную страницу и нихуя! Появляется она только если перезапустить сервер. Походу синтерпретированный код висит в памяти пока не перезагрузишь сервер, как с этим бороться?

    Третий вопрос про работу с массивами ой блять простите списками.
    Вот есть такое гавно:

    
    test = []
    test[0].append('test')
    

    Кэп будет ругаться что такого индекса нет. Ума хватает только на такой пиздец:

    
    test = [0: {}]
    test[0].append('test')
    

    Как в питоне правильно и красиво присваивать индексы?

  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 12:20, спустя 11 минут 13 секунд

    1 а зачем собственно генерировать урлы? почему нельзя вбить сразу эти четыре записи? а если нужно сдлеать вьюху, которая показывает записи из бд, то надо делать как здесь Создаём своё первое приложение с Django, часть 3 — Документация Django 1.8 [djbook.ru]

    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

    2 потому что ты неправильно сделал первый пункт

    3 это не пхп

  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 28 сентября 2015 г. 14:05, спустя 1 час 44 минуты 34 секунды

    @Sinkler, но там ведь в примере регулярка для конкретного урла вида ^/polls/[0-9]+/$
    а у меня урлы динамически генерятся по формуле урлы_родителей+'/'+урл_элемента+'/' с произвольной глубиной вложенности, а для такой схемы универсальную регулярку не создать, так как же быть?

  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:16, спустя 11 минут 42 секунды

    @Crank, обычно передают полностью путь как аргумент во вьюху

    url(r'^(?P<slugs>[a-z0-9]+)/$', views.Detail, name='detail'),

    а во вьюхе уже разгребают примерно так

    class Detail(View):
        def get(self, request, *args, **kwargs):
            slugs = kwargs['slugs'].split('/')
            for slug in slugs:
                try:
                    object = self.object.get_children().get(slug=slug)
                except ObjectDoesNotExist:
                    raise Http404
            # ...
            return self.render_to_response()
    

    Спустя 112 сек.

    для работы с деревьями в жанге обычно используют что-то похожее django-mptt/django-mptt [github.com]

    и к ней можно найти такие плюхи в тему c0ntribut0r/django-mptt-urls [github.com]

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:25, спустя 8 минут 44 секунды

    3: То что ты создал лист не говорит о том что все что ты дальше с ним будешь делать тоже будет листом )) надо лист вложенный в лист - создай его :)

    Это такая жесткая магия в пхп изза которой я его любил в свое время. Своеобразная киллер фича.

    1: Про url понял что ты делаешь, типа CMS, с деревом. Хуйня идея конечно у тебя в итоге urlresolver загнется в потугах на каждый чих обрабаывать 100500 юрлов. Тебе как сказал @Sinkler надо просто большую прожорливую регулярку и вьюху которая будет этот путь обрабатывать занмаясь поиском в базе.

    для всего остального в url есть Django Macros Url

    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:26, спустя 1 минуту 2 секунды

    Мне для деревьев больше treebeard понравился, он поддерживает все способы хранения - вложенные множества, материализованные пути

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:27, спустя 56 секунд

    2: хуйня какая то, у тебя же в базе хранится это все раз через админку редактируешь. Из базы на лету всегда все читалось)) у тебя кеш приложение никакое не стоит случаем? ctrl-r в браузере пробовал? может страница наглухо браузером кешируется?

    Спустя 18 сек.

    Мне для деревьев больше treebeard понравился, он поддерживает все способы хранения - вложенные множества, материализованные пути

    @AlexB, холодильник белый потому что крыло самолет ))

    Сапожник без сапог
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:29, спустя 2 минуты 10 секунд

    2: хуйня какая то, у тебя же в базе хранится это все раз через админку редактируешь. Из базы на лету всегда все читалось)) у тебя кеш приложение никакое не стоит случаем? ctrl-r в браузере пробовал? может страница наглухо браузером кешируется?

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

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:32, спустя 2 минуты 18 секунд

    @Sinkler, а блядь, все сообразил. Резолвер да, реализован через lazyobject, во вторых у тебя код тоже только 1 раз грузится. Короче как тут принято - ты сам мудак, инструмент непричем.

    Сапожник без сапог
  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 28 сентября 2015 г. 14:32, спустя 44 секунды

    @Sinkler, разобрался, огромное спасибо!

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:35, спустя 2 минуты 14 секунд

    2: хуйня какая то, у тебя же в базе хранится это все раз через админку редактируешь. Из базы на лету всегда все читалось)) у тебя кеш приложение никакое не стоит случаем? ctrl-r в браузере пробовал? может страница наглухо браузером кешируется?

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

    @Sinkler, я подумал что он не может отредактировать запись в админке :)

    Сапожник без сапог
  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 28 сентября 2015 г. 14:41, спустя 6 минут 28 секунд

    @phpdude, да записывать все возможные урлы в список было тупой идеей, но надож было разобраться как это шапито работает =)

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 сентября 2015 г. 14:49, спустя 7 минут 57 секунд

    @phpdude, да записывать все возможные урлы в список было тупой идеей, но надож было разобраться как это шапито работает =)

    @Crank, да, туповата. Но поначалу все на всяких мелочах обжигаются

    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 сентября 2015 г. 12:31, спустя 21 час 42 минуты 8 секунд

    @Crank,

    1. @Sinkler прав
    2. @Sinkler прав
    3. Зачем так вообще делать не знаю, но если хочется как в php, то может тебе подойдёт dict (test.setdefault([]))? Или defaultdict?
    
    from collections import defaultdict
    
    test = defaultdict(list)
    test[0].append('test')
    
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Crank

    Сообщения: 542 Репутация: N Группа: Джедаи

    Spritz 29 сентября 2015 г. 13:14, спустя 42 минуты 25 секунд

    @adw0rd, спс, мне важно было понять правильно ли я делаю или коряво.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!