Ответы пользователя по тегу Django
  • Не запускается проект. Не подскажете в чем может быть проблема?

    1) Кажется, вы запускаете проект, написанный для старой Django, под последней версией 1.11. Думаю, что надо использовать ту версию, на которой вы его писали.
    2) попробуйте 127.0.0.1:8000/admin/, /login/ - они в списке есть.
    Ответ написан
    1 комментарий
  • Как переопределить возможные значения ManyToManyField в InlineModelAdmin с учётом значения другого поля инлайн-формы?

    Поле filter не является редактируемым. Я думаю, что вам нужно получать доступ не к полю, а к объекту модели VariantAttribute. Верно?

    Если так, то вам должен подойти вот этот вариант: https://stackoverflow.com/a/22003809/1245471 - здесь предлагают создать отдельный класс для формы и провести фильтрацию в нём, а потом задать этот класс для VariantAttributeInline (атрибут form, если мне не изменяет память).
    Ответ написан
  • Как отсортировать записи модели данных на основе данных других связанных моделей?

    Не уверен, как сделать это через ORM, надо экспериментировать. Если кто-то предложит, будет интересно посмотреть. Если никто не предложит, то я бы сделал так.

    class Characteristic(models.Model):
        project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='characteristics')
        ...
    
    class Task(models.Model):
        project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='tasks')
        ...
    
    ...
    
    import operator
    
    latest_comments_by_category = Project.objects.values_list('id').annotate(
        Max('characteristics__comments__created'),
        Max('tasks__comments__created'),
    )
    
    latest_comments = [
        (project_id, max(characteristic_time, task_time))
        for project_id, characteristic_time, task_time in latest_comments_by_category
    ]
    
    projects = [
        Projects.objects.get(id=project_id)
        for project_id, _ in sorted(latest_comments, key=operator.itemgetter(1), reverse=True)
    ]


    Конечно, это допустимо лишь, если проектов не слишком много.
    P. S. Скорее всего это какой-то блок статистики. Его можно кэшировать для ускорения страницы.
    Ответ написан
  • Django response в формате json?

    В долгосрочной перспективе стоит использовать Django REST Framework: djangorestframework.org
    Ответ написан
    1 комментарий
  • Best practies? Две независимые модели для пользователя и админа, Django 1.11.x?

    Делить пользователей на две таблицы не стоит, хотя бы потому, что множество библиотек сразу же не сможет с такой системой работать, или придётся писать костыли.

    Я думаю, что проще всего использовать стандартную модель User + свою модель Profile, подключённую через OneToOneField. В ней можно собирать все необходимые свойства. Что мешает модератору сайта одновременно быть покупателем футболочек? Собственно ничего.

    А теперь что касается проверок на is_staff. Посмотрите django-braces. Вам достаточно использовать class based views и подключать нужные mixins, - и вы забудете об этих проверках: большая их часть будет выполняться в mixins, а не в бизнес-логике предметной области. Вы можете и свои классы для этого дела написать.
    Ответ написан
    4 комментария
  • Как в django-rest Serializator получить список определенных моделей?

    1) TypeSerializer нигде не вызывается. Откуда Django знает, что вы хотите его использовать?
    2) См. документацию. Вам надо, мне кажется, nested relationship. www.django-rest-framework.org/api-guide/relations/...
    3) serializator - ну зачем ужас такой? На русском "сериализатор". На английском "serializer". И никак иначе.
    4) Лучше уходить от views в виде функций сразу и навсегда. Используйте class based views.
    5) Учитывая, что вы используете DRF и она предоставляет множество классов для этого начиная от APIView. А ещё такие удобные штуки как viewsets и routers.
    Ответ написан
  • Свой middleware django?

    class ProjectMiddleware:
        def process_request(self, request):
            assert hasattr(request, 'user'), (
                "The Project middleware "
                "requires authentication middleware to be installed. Edit your "
                "MIDDLEWARE_CLASSES setting to insert "
                "'django.contrib.auth.middleware.AuthenticationMiddleware'. "
                "If that doesn't work, ensure your TEMPLATE_CONTEXT_PROCESSORS "
                "setting includes 'django.core.context_processors.auth'."
            )
    
            if request.user.is_authenticated():
                request.project = ...


    Не забудьте добавить путь к классу в settings.MIDDLEWARE_CLASSES.
    Ответ написан
    Комментировать
  • Как исправить ошибку при запуске тестов?

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

    • Если проект учебный и миграции удалить не жалко - то удалите и сделайте новые, проверьте, будет ли проблема повторяться.
    • Если жалко - сделайте grep DateTimeField */migrations/* по всем миграциям и посмотрите, нет ли там где-нибудь неправильных значений datetime (например, в качестве аргумента default).
    • И также проверьте те же поля во всех models.py на предмет того же самого.
    Ответ написан
  • Как прописываются пути к django на серверах хостера?

    Самый простой способ - обратиться к автору, что было бы просто и естественно.

    • Если вы не обращаетесь к нему - это наводит на мысль о неком конфликте между вами. Другого объяснения не видно. При хороших отношениях он бы не отказался просто развернуть вам проект, это быстро, и вам это бы много не стоило даже при оплате по времени. Если он держал проект у себя, вы им пользовались, а потом просто пропал - ну... всякое бывает, но странно.
    • Коль скоро вы уже пользовались проектом прежде, пока он был на сервере разработчика, и теперь хотите продолжать - это значит, что с функциональной точки зрения проект вас устраивает.


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

    Делать app для каждого города и копировать весь код, учитывая, что он одинаковый? нет смысла.

    Лучше рассмотреть проблему иначе. Начнём с зарегистрированных пользователей. Создайте модель City, обозначающую город. Также создайте custom user profile model под названием, скажем, Profile, которая привязана к User отношением one to one. В модели Profile добавьте внешний ключ на City.

    Наконец, реализуйте:
    • Выбор города (можно через AJAX)
    • Вывод на каждой странице сайта только той информации, что соответствует выбранному в request.user.profile.city городу.


    Если же поддержка города нужна и для анонимных пользователей (скорее всего это так), то стоит использовать переменную сессии в качестве дополнительного слоя. В одном из проектов у меня это делается так:

    1. Если есть переменная сессии, то используется она для фильтрации всего и вся
    2. Если её нет, но пользователь зарегистрирован - то берётся значение из БД и сохраняется в сессию, далее как в первом пункте
    3. Если и того нет - у меня запрещён доступ, так надо; ну а у вас пользователю (в вашем случае) надо предложить выбрать значение из списка.


    Таким образом и анонимусы поддерживаются, и при сбросе сессии у зарегистрированного юзера не теряется выбранный вариант.
    Ответ написан
    Комментировать
  • Как сделать у формы django поле "disabled" прямо в template?

    Это можно сделать в форме. Да и то, саму логику стоит писать во view. Сначала передать форме аргумент, который определяет, делать ли поля disabled. А затем, уже в форме, проставлять атрибуты полям.

    class MyView(...):
        form_class = MyForm
    
        def get_form_kwargs(self, ...):   # название метода условно, не уверен, что он так называется в generic views и даже что он есть :)
            kwargs = super(MyView, self).get_form_kwargs(...)
            kwargs.update({'disabled': not self.request.user.has_perm(...)})
            return kwargs
    
    class MyForm(...):
        def __init__(self, *args, **kwargs):
            is_disabled = kwargs.pop('disabled')
            super(MyForm, self).__init__(*args, **kwargs)
    
            if is_disabled:
                self.fields['foo'].widget.attrs.update({'disabled': 'disabled'})
    Ответ написан
    1 комментарий
  • Как правильно писать методы в CBV в Django?

    Я не думаю, что вам нужно делать всё с нуля. Надо использовать Django REST Framework, там уже есть базовые классы и уже есть логика, которую вы описали. В частности, имеется и авторизация по API token. Нужно только почитать документацию, разобрать, как там всё работает, и сделать свои классы, наследуя APIView (или что-то другое, что вам больше подойдёт).
    Ответ написан
    Комментировать
  • Какой набор инструментов порекомендуете для работы с картами на Python?

    • Для хранения геоданных: PostgreSQL/PostGIS. django.contrib.gis обеспечивает родную поддержку, плюс библиотеки geos, geopy для расчётов расстояний и прочего.
    • Для взаимодействия с front-end - Django REST Framework со сторонними модулями, которые обеспечивают ей понимание gis-полей.
    • Для рисования карт на front end: js-библиотека Leaflet с использованием свободно доступных слоёв (google maps или open street map) и своим кодом, взаимодействующая с back end через вышеупомянутый API.
    Ответ написан
    1 комментарий
  • Как выводит списка наиболее посещаемых страниц django?

    1) Django это фреймворк. Ничего само по себе не сохраняется.
    2) Вам потребуется или найти, или написать самому, middleware для подсчёта этих просмотров, и view для их вывода.
    3) Пожалуйста, пишите вопросы внимательно. Повторы слов, отсутствие запятых и точек. Умение грамотно выражать свои мысли - одно из необходимых качеств профессионального разработчика.
    Ответ написан
    Комментировать
  • Как освоить магию 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 комментарий
  • В чем разница групп с правами и булевыми полями юзера?

    Стандартные разрешения в django привязаны к CRUD-операциям, и даже без R: create, update и delete. Таким образом, эти операции определяют доступ к конкретным категориям объектов.

    Флаги is_active, is_staff и is_superuser имеют более общий смысл: они определяют статус пользователя, его положение в системе. Если not is_active, никакие выданные пользователю permissions не применяются. Если is_superuser, то они не имеют никакого значения - у пользователя есть все permissions, которые в системе есть, и даже те, которых нет (has_perm() возвращает всегда True).

    Наконец, is_staff определяет доступ к админке и, таким образом, указывает, можешь ли ты в рамках админки использовать те permissions, что тебе назначены.

    Таким образом, перечисленные флаги являются не аналогом permissions, а ортогональны им, регулируя применение уже имеющихся permissions.
    Ответ написан
    Комментировать
  • Альтернатива Sentry для Django?

    Просто разворачиваете Sentry у себя на сервере и работаете с нею.
    Ответ написан
    Комментировать
  • Как понять CBV и GV?

    Разница появляется тогда, когда количество view становится сколь-нибудь значительным. В своих проектах мы используем почти исключительно CBV и стараемся уйти от функций-view как можно дальше. Посмотрите на библиотеку: https://github.com/brack3t/django-braces

    Предположим, что у вас 30 разных view, и из них 10 должны быть доступны только суперпользователю, 15 - только зарегистрированным пользователям с разными permissions, а 5 - анонимусам и ботам. Чтобы это сделать на FBV, надо будет в каждой функции писать проверку заново или делать какие-то специальные функции типа check_superuser(), которые в случае неуспеха выбрасывают 403. Но согласитесь, что это некрасиво. То ли дело с CBV:

    class ReactorCreateView(PermissionRequiredMixin, CreateView):
        permission = 'myapp.create_reactor'
        model = AtomicReactor


    и собственно всё. Вы можете легко поменять одно на другое.

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

    Так что CBV - это дико полезная вещь; советую вам сразу только ими и пользоваться, чтоб потом не было мучительно больно переписывать разросшуюся груду процедурной лапши.
    Ответ написан
    5 комментариев