• Где хранить абстрактные модели в Django?

    @alex_vv
    Перешел с Sharepoint на Python/Django - счастлив!
    Теоретически - хранить можно где угодно.

    На практике три варианта:

    1. Если это разовый проект, мало моделей - в том же models.py
    2. Разовый проект, много моделей, хочется все организовать - абстрактные модели можно хранить, например, в отдельном файле abstracts.py и импортировать в models.py
    3. Абстракные модели повторно используются - создать для них отдельное приложение и в models.py хранить только абстрактные модели, потом импортировать их в любой проект.

    Полная свобода действий :-)
    Ответ написан
    Комментировать
  • Как ограничить поиск url'ов в django, чтобы избежать пересечений?

    @alex_vv
    Перешел с Sharepoint на Python/Django - счастлив!
    Все проще - поменяйте их местами в urls.py:

    1. site/admin/ # первым ссылка на аминку
    2. site/product1/ # только после ссылка на view c параметрами.

    Тогда все будет ОК и писать ничего не надо.
    P.S. Ну а обычно для продуктов создают ссылки типа site/product/1 - тогда точно не пересекутся с другими views.
    Ответ написан
    Комментировать
  • Как вывести одно поле несколько раз в форме?

    @alex_vv
    Перешел с Sharepoint на Python/Django - счастлив!
    В вопросе 2 сомнение правильно подмечено, если надо все лишь сохранить расценки исполнителя по определенной категории, проще использовать:

    - модель исполнителя
    - модель категории
    - модель "расценка исполнителя" с двумя ключами FK - один к исполнителю, второй к категории

    M2M через through в такой ситуации - перебор.
    Это из того, что видно из представленного примера. Возможно полный проект накладывает иные требования.

    Ну а если все же первый вариант:

    1. Вывести несколько раз одно поле модели в форму - значит форму надо кастоимзировать и лаконичным fields = '__all__' не обойтись:
    class AddPerformerForm(ModelForm):
       category1 = прописываем обычное поле формы, дублирует поле модели (max_length, и т.п.)
       category2 = прописываем обычное поле формы еще раз
    
        class Meta:
            model = Performer
            fields = ('performer`, 'price`) # вместо "все", пишем остальные нужные поля кроме категорий
            # exclude тогда не требуется


    2. Раз форма кастомная, view тоже надо прописать с кодом, где данные категории1 и категории2 или сколько бы их там ни было (ведь это many-to-many, а вы решили вручную их в html добавить в произвольном количестве) обрабатываются в таком порядке:
    - (1) форму сохранить с опцией save(commit-false),
    - (2) добавить к моделе исполнителя все нужные категории и, в завершение
    - (3) сохранить модель/форму в базу через save().

    Но перестроить отношения моделей могло бы все здорово упростить и позволило бы использовать лаконичное объявление форм и встроенные CreateView и т.п.
    Ответ написан
    Комментировать
  • Как отобразить архив статей?

    @alex_vv
    Перешел с Sharepoint на Python/Django - счастлив!
    На всякий случай, есть второй вариант.

    Если в Django настроить два админ-сайта, например, один для пользователей с ограниченными набором моделей, а второй - для админа со всеми моделями и/или с архивными записями.
    Из вопроса прослеживается, что архитектура проекта как раз предполагает разнести работу с моделями (зачем-то же архивные статьи вынесены отдельно?)

    Тогда можно не создавать прокси для каждой "архивируемой" модели (если их много), а легко зарегистрировать одну и ту же модель в разных админках:

    # для всех 
    admin.site.register(Article, ArticleAdmin)
    # для админа и модераторов архива
    archive.register(Article, ArchiveAdmin)


    В примере:
    1. `archive` - это второй админ-сайт
    2. видно, что на одну модель возможно прописать два разных класса админки

    Отдельная админка под отдельным `url` прописывается 2-3 строчками в `urls.py` в корне проекта, в документации есть.

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