• Как освоить магию url в Django?

    Получив запрос на ссылку /post_list/, url matcher проходит по всем шаблонам в urls.py по очереди. Первй, который подходит - это:

    url(r'', include('blog.urls')),

    Поскольку регулярное выражение пустое, то Django берёт весь ваш URL и начинает искать его в blogs.urls, находя:

    url(r'^$', views.index, name='index'),

    Вам нужно как минимум ссылку на index убрать из blogs/urls.py в projectname/urls.py.
    Ответ написан
    1 комментарий
  • Как освоить магию url в Django?

    @AlexandrBirukov
    urlpatterns = [
        url(r'^admin/', include(admin.site.urls)),
        url(r'', include('blog.urls')),
        url(r'^post_list/', include('blog.urls')),
    ]

    вот тут url(r'^post_list/', include('blog.urls')) убираем, смысла подключать два раза одно и тоже нет

    urlpatterns = [
        url(r'^$', views.index, name='index'),
        url(r'^$', views.post_list, name='post_list'),
    ]

    а тут второй урл делаем уникальным, вообще ищется первое совпадение, остальные игнорятся
    Ответ написан
    1 комментарий
  • Django. Как защитить форму от множественной отправки?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    class FloodSafeMixin(object):
        def __init__(self, *args, **kwargs):
            request = kwargs.pop('request', None)
            if request:
                self._user = request.user.username if request.user.is_authenticated() else None
                self._ip = get_ip(request)
                self._period = OrderedDict()
                self._period['days'] = kwargs.pop('days', None)
                self._period['hours'] = kwargs.pop('hours', None)
                self._period['minutes'] = kwargs.pop('minutes', None)
                self._period['seconds'] = kwargs.pop('seconds', None)
                self._period['milliseconds'] = kwargs.pop('milliseconds', None)
                if not any(self._period.values()):
                    self._period = {'minutes': 1}
                else:
                    self._period = OrderedDict([(k, v) for k, v in self._period.items() if v])
            else:
                self._ip = None
            super(FloodSafeMixin, self).__init__(*args, **kwargs)
    
    
        def clean(self):
            cleaned_data = super(FloodSafeMixin, self).clean()
            sender_id = hashlib.md5((self._user if self._user else self._ip).encode('utf-8')).hexdigest()
            if sender_id:
                class_name = self.__class__.__name__
                cache_name = 'last-submit.{0}.{1}'.format(class_name, sender_id)
    
                now = datetime.now()
                last_submit = cache.get(cache_name, now - timedelta(days=1))
                if (now - last_submit) < timedelta(**self._period):
                    cache.set(cache_name, now)
                    period = ' '.join([u'{0} {1}'.format(v, _p('genitive', k)) for k, v in self._period.items()])
                    raise forms.ValidationError(_('Form submitted less than %(period)s ago'), code='flood',
                        params={'period': period})
                else:
                    if not self.errors:
                        cache.set(cache_name, now)
            return cleaned_data
    
    
    class FeedbackForm(FloodSafeMixin, forms.Form):
        ...
    
    
    class SomeFormHandlerView(FormView):
        def get_form_kwargs(self):
            kwargs = super(GenericFormHandlerView, self).get_form_kwargs()
            kwargs['request'] = self.request
            kwargs['minutes'] = 2
            return kwargs
        ...
    Ответ написан
    Комментировать
  • Как добраться до базы данных?

    bogdan_uman
    @bogdan_uman
    шлЫмазл неукЪ-поцЪ
    Ну как-бы рельсы не запускают сервер для БД, а только конектятся, настройки которые делаются с файле "config/database.yml". В SQlite нету сервера, вот что пишет вики
    то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется, и движок становится составной частью программы.
    Ответ написан
    Комментировать
  • Как добраться до базы данных?

    HighQuality
    @HighQuality
    ☁ Ниндзя девелопер
    Тут нужно разобраться не в Ruby/ROR, а в том как устроена и работает SQLite база - точно так же она может работать и для yii2, если верно настроить приложение.

    Базу sqlite не нужно поднимать, демонов на сервере нет (хотя кто их знает..).
    Ответ написан
    Комментировать
  • Как обновить изображения в Yii2?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    В одном аттрибуте должно содержаться имя файла в другом сам файл.
    Допустим в базе у Вас 'imagename', на него вешаем валидатор string
    добавляем в модель другой атрибут public $file; вешаем на него валидатор image и его используем в форме, а 'imagename' дергаем только если есть что-то в $_FiLES
    видео урок: загрузка фото в yii2
    Ответ написан
    1 комментарий
  • Где найти вариант тех. поддержки с возможностью обсуждения и предложений на сайт?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    оторый позволяет получить власть над соц сетями

    CH2i8hWUsAAUoDL.jpg
    Сервер сам написан на yii2

    CH2i8hWUsAAUoDL.jpg

    Я так понимаю нужно что-то типа:
    reformal.ru
    Хотя хз. Стоит ли что-то советовать человеку, который написал на yii сервер и подчинил соц сети.
    Ответ написан
    Комментировать
  • Где взять дизайны (.psd) для практики верстки?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    с псд любой дурак может, с пережатого жпега попробуй, вот где скилл )
    Ответ написан
    7 комментариев
  • Советы начинающему рубисту по предюниоровскому трудоустройству, на что обратить внимание?

    @mamayama
    по предюниоровскому трудоустройству


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


    И не надейтесь.
    Ни к чему такому интересному даже джуна не сразу подпускают.
    Ответ написан
    Комментировать
  • Trailblazer gem Как использовать если форма состоит не из одной модели?

    @ksim_miloff
    1.1 Для работы с формами в trailblaizer есть reform, который через Composition позволяет внутри себя описать объект-форму сразу для нескольких моделей. Потом этот объек-форму можно скормить рельсовому formbuilder'у.
    1.2 В чем проблема с передачей в cell больше одной модели?
    Some::Cell::Example.(nil, model1: model_instance1, model2: model_instance2).()

    или даже так:
    Some::Cell::Example.({model1: model_instance1, model2: model_instance2}).()

    В первом случае к данным будет доступ через options, во втором через model.
    2 Это не похоже на вопрос.
    3 Trailblazer не плохая штука, но на мой вкус слишком большая и магическая, мне не нравится как компоненты друг в друга проникают :), предпочитаю брать его частично, например только reform и cells, а вместо операций брать гем interactors. Кроме того сам разработчик trailblaizer'а не очень любит рельсы, неоднократно убеждался в этом читая его ответы на гитхабе, когда у rails-программистов возникают проблемы.
    Ответ написан
    Комментировать
  • Как отобразить список категорий и связаных товаров на одной странице?

    @AlexandrBirukov
    {% for category in categorys %}
    {{ category }}
    {% for book in category.category_book.all %}
    {{ book }}
    {% endfor %}
    {% endfor %}

    Это в шаблоне, а во вьюхе:

    model = Category
    context_object_name = 'categorys'
    Ответ написан
    1 комментарий
  • Как в tinymce убрать автоматическое добавление тега?

    NeiroNx
    @NeiroNx
    Программист
    stackoverflow.com/questions/22902625/remove-automa...
    var settings = {
    ...
    forced_root_block : '',
    ...
    };
    Ответ написан
    Комментировать
  • Как организовать хранение файлов на сервере?

    @marazmiki
    Укротитель питонов
    Правильно ли я понимаю что для хранение файлов их нужно разбивать по папкам,

    Неправильно.
    Для того, чтобы файлы загружались и благополучно отдавались, сегментировать (разбивать по папкам) их совсем не обязательно.

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

    А на боевых серверах использование хранилища в локальной файловой системе и вовсе нонсенс. Там эта проблема не стоит в принципе.

    Сегментацию можно сделать для, скажем так, красоты. Или чтобы было понятно, кому принадлежит тот или иной файл. Но практическая польза от неё сомнительна. Вреда, впрочем, тоже нет :)

    допустим на сервер пользователь с Ником username заливает файл file.mp4, и я сохраняю этот файл по пути u/us/use/user/usern/file.mp4 и такой путь формируется для каждого пользователя

    Опять неправильно.

    Во-первых, никогда, НИКОГДА не доверяйте данным, пришедшим от пользователя. Сохраняете загруженный файл – сгенерируйте имя сами. А оригинальное имя не возбраняется сохранить и в другом месте. Если понадобится дать возможность пользователю сохранить файл под оригинальным именем, это делается в несколько строк.

    Во-вторых, Ваша сегментация слишком агрессивная. Если представить, что юзернейм может состоять только из строчных латинских букв и цифр (итого алфавит 26+10=36 символов), то такое хранилище сможет вместить 36 ^ (1 + 2 + 3 + 4 + 5) = 36^15 = 2.21 * 10^23 файлов без повторений. А что если юзернейм короче 5 символов? А что если он переименуется?

    Помните "во-первых"? Так как нам нужно самим придумать имя файла, почему бы не воспользоваться либо UUID и сгенерировать уникальное (с высокой достоверностью) значение вида 28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc, а его уже сегментировать? Например, два сегмента по два символа датут прикольные ссылки вида 28/c5/28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc и возможность разместить 65 тысяч файлов так, чтобы они были по одной штуке в директории :)

    Есть также вариант использовать не UUID, а посчитать контрольную сумму файла и взять её в качестве имени. Практическая ценность такого хеша, правда, тоже стремится к нулю :)

    если будет 2 одинаковых названия файла у одного пользователя то просто добавляю к новому файлу номер (file1.mp4)

    Если речь идёт о Джанге, то она сама так делает, это штатная функция хранилища.
    Ответ написан
    1 комментарий
  • Можно ли задавать имена переменных в шаблоне Django на кириллице?

    sim3x
    @sim3x
    Не надо делать 1с на моей джанго
    Ответ написан
    Комментировать
  • Какой функционал необходимо сделать на yii2, чтобы работодателю было понятно, что я с ним знаком?

    @SharuPoNemnogu
    не язык плохой, программисты такие...
    Писать надо не для того, чтобы показать кому то, чтобы заценили, а для того, чтобы познать фреймворк во всех тонкостях. Можно и за пол дня набросать через gii Ваш мега сайт с характеристиками и блэк джеком не вникая во внутренние механизмы и фишки.

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

    Работодатель не будет смотреть весь функционал, что вы там на ваяете, мб обратит внимание на какие то интересные сложные моменты, показывающие Ваш скилл, но врядли. Код просят, чтобы посмотреть стиль оформления и наличие говнокода (лишние/не объявленные переменные например).

    Что написать? В основном это crm.
    Ответ написан
    1 комментарий
  • Как узнать установленные модули в Django и опубликовать проект?

    @AlexandrBirukov
    1.
    pip freeze - из под виртуалки покажет все пакеты.
    pip freeze > requirements.txt - сохранит список пакетов в файл, потом можно будет все установить на боевой сервак pip install -r requirements.txt
    2.
    я думаю вариантов переноса много, но в общем если это vps, то надо сначала настроить сам сервак, установить требуемые пакеты, перенести сам проект, поправить в нем как минимум settings.py, настроить статику - просто скопировать проект как есть в папку на сервере не получится.
    3.
    если это mysql, то переносить можно и через phpmyadmin, только может быть проблема при переносе крупной базы, тк есть ограничения в php по размеру загружаемого файла.

    busy-brain.ru/post/9 - тут все по шагам на русском)
    Ответ написан
    5 комментариев
  • Как лучше подключать библиотеки в Codeigniter?

    @egormmm
    Борітеся — поборете!
    1. Если часто используется какой-то компонент, подключайся его через автолоад. Так код будет чище и понятней. Те лишние мс на загрузку значения не имеют.

    2. Данные из post принимай через $this->input->posts('name'). Посмотри встроенную библиотеку input-.

    3. На предмет наличия файла view проверку не делай. Если файла нет страница ошибки выйдет сама.

    4. Header и footer лучше подключать во view файле, а не контроллере.

    5. Ну и собственно у тебя все в куче в модели. Все действия нужно разнести в отдельный методы. Или даже Объекты.
    Ответ написан
    2 комментария
  • Что плохого и критично неприемлемого в Codeigniter?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    что бесит в CI:
    1. $this->loader->library("lib_name");
    - подключение зависимостей происходит через лоадер, любая библиотека, является singliton объектом,это порождает некоторые проблемы в тех местах где нужны новые экземляры, а нужны синглитоны в 2% случаях
    - автоподстоновка в IDE не работает
    - отсутствие многослойности, мы можем get_instance()->loader->library("lib_name"); сделать в любом месте даже в классе ядра, что позволяет разрабатывать сильно связанный монолитный код
    как нужно:
    class Controller function __construct(LibName $lib_name){} - все

    2. Класс к бд простой query builder, как ни крути в результате много дублирующего кода, - работа с массивами зло, когда строишь приложение и пишешь CRUD справочники например для админки, то придется писать прослойки - CRUD классы, а это тот же Repository, иногда нужно одни и те же модели отделять от слоя хранения а это уже datamapper, и вообще удобно использовать коллекции а не массивы данных получаемых из бд, если все вместе взять то тут и приходит необходимость использовать ORM который имеет под капотом все необходимое.

    3. Логгер, ну не psr он, нельзя отказаться от хранилища в файлах и логировать в бд, или выводить на экран в консоль. После использования monolog, логгер CI выглядет убого

    4. Миграции, если честно пробовал запускать, работают из браузера, а должны из консоли, можно создать консольные контроллеры с накаткой миграций, но тем не менее приходится много править в миграциях и коде когда меняется структура таблиц, например простейшая задача сменили название колонки, прошлись по коду сменили все использования этой колонки, создали миграцию, изменили модели, если проект большой сделать это не просто. В Propel2 ORM это делается в одном месте в xml конфиге и модели, миграции, перестраиваются одной командой.

    5. тесты под капотом они убоги, просто так unit тесты не запустить нужно долго плясать с бубном.
    6. Exception просто отсутствуют, работа с исключениями ведется через собственный механизм
    7. PSR не используется
    8. Работа с конфигами, они разделяются по папкам окружения, не кошерно, особенно когда все добро с доступом к бд комитят в гит, используйте .env

    п.с. в новой версии знаю уже многие вещи будут исправлены но тем не менее проще собрать приложения на каркасе https://github.com/mmeyer724/Frameworkless
    Ответ написан
    3 комментария
  • Как решить проблему в django в блоге?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Что это за безумная каша из конструкций {% url 'main:blog/get_absolute_url' %}? Тег {% url %} ожидает получить имя url'а, то есть в вашем случае {% url 'main:blog' blog.slug %}, после чего возвращает url. И метод get_absolute_url делает то же самое. То есть вы пытаетесь получить url из объекта blog и передать его опять тегу url. Зачем? К тому же методы не вызываются через косую черту. И ещё, зачем у вас в шаблоне, после тега extends запятая?
    Ответ написан
    Комментировать
  • Обновление записи по ajax в БД по клику id div блока, как реализовать?

    @forgetable
    Node/Flutter/C++
    Вы не совсем правильно понимаете, как это всё происходит, мне кажется. Нет такой команды, которая возьмёт и добавит всё в базу. На клиенте вам нужно поймать onclick события(читайте javascript события), потом передать какие-то данные на сервер через XMLHttpRequest / более новый fetch, затем обработать их любым серверным языком, в том числе серверным javascript, и через него добавить их в базу. Если не хочется писать говнокод - лучше не использовать jQuery и прочие тяжеловесные и бессмысленные на данном этапе фреймворки.

    Кстати, оборачивать кнопку в ссылку вам не нужно - ссылки нужны только тогда, когда нужно увести пользователя на другую страницу с перерисовкой.
    Ответ написан
    1 комментарий