• Django2 to Django3, url to path...?

    @Realmixer
    Full stack Python (Django) web-developer
    urlpatterns = [
        re_path('<int:year>/<int:month>/<int:day>/<slug:slug>/'),
    ]
    Ответ написан
    Комментировать
  • Django Rest Framework, TypeError: __init__() takes 1 positional argument but 2 were given. Почему происходит?

    @Realmixer
    Full stack Python (Django) web-developer
    Ошибка в urls.py, неправильно прописан класс отображения — не хватает вызова метода as_view. Надо так:
    urlpatterns = [
        path('quiz/bookmark/create-remove/<slug:slug>/', views.CreateRemoveBookmarkAPI.as_view(),
            name="bookmark-create-remove-api"),
    ]
    Ответ написан
    Комментировать
  • Как сделать вычисляемое поле в модели Django?

    @Realmixer
    Full stack Python (Django) web-developer
    Например, через сигналы:
    @receiver(post_save, sender=FingerPrint)
    def update_calculated_fields(sender, instance, **kwargs):
        tlsh = instance.calculate_tlsh()
        sender.objects.filter(pk=instance.pk).update(tlsh=tlsh)
    Ответ написан
    2 комментария
  • Почему не работает static после того, как выложил на хостинг?

    @Realmixer
    Full stack Python (Django) web-developer
    1. Необходимо определить STATIC_ROOT — в неё Django копирует файлы из STATICFILES_DIRS.
    2. Решить, в каком каталоге вы будете держать общую статику проекта, которая не относится к какому-то конкретному приложению. Прописать его в STATICFILES_DIRS.
    3. Не нужно указывать в STATICFILES_DIRS каталоги конкретных приложений — Django по умолчанию и так собирает в STATIC_ROOT всё что найдёт в каталогах static внутри приложений.

    Таким образом конфигурация может быть такой:
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, "static") # Изначально пустой каталог, куда Django соберёт всё при выполнении manage.py collectstatic
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static_dev"), # Каталог, куда вам нужно складывать статику проекта, не относящуюся к конкретному приложению
    ]


    Плюс, если вы запускаете сайт в через runserver, то нужно настроить раздачу статики в режиме разработки. И не забывайте после любых изменений в файлах статики запускать manage.py collectstatic. Удачи!
    Ответ написан
    Комментировать
  • Коллеги, как Вы выходите из положения, когда нужно постоянно приводить ПК в исходное состояние?

    @Realmixer
    Full stack Python (Django) web-developer
    С нулевых пользуюсь для этого Norton Ghost. Только не той, что под Windows, а которая загрузочная. Хоть производитель её давно не поддерживает, но она до сих пор входит в состав многих usb-recovery.

    В общем-то ничего особенного про неё не скажу: позволяет бэкапить разделы или целые диски, есть сжатие. Простая, как калаш, но своё дело делает идеально (для меня). Когда в институте учился и приходилось насиловать свой ноутбук десятками чужих флешек, то взял за правило каждый день восстанавливать системный раздел.
    Ответ написан
    2 комментария
  • Выбор связей между таблицами в БД?

    @Realmixer
    Full stack Python (Django) web-developer
    Предлагаю такую схему:
    class Vendor(models.Model):
        ...
    
    class Module(models.Model):
        MODULES_NAME = (
            ("Sourcing", "Sourcing"), ("SA", "SA"),
            ("SXM", "SXM"), ("CLM", "CLM"),
            ...
        )
        name = models.CharField(max_length=50, choices=MODULES_NAME)
        is_active = models.BooleanField(default=True)
    
    
    class VendorModule(models.Model):
        vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
        module = models.ForeignKey(Module, on_delete=models.CASCADE)
        is_active = models.BooleanField(default=True)
        info1 = models.TextField(max_length=500)
        info2 = models.TextField(max_length=500)

    Связь модулей с вендорами осуществляется через VendorModule — фактически это связь многие-ко-многим с возможностью сохранения дополнительной информации. Назначение модели Element непонятно, поэтому дополнительная информация убрана в VendorModule. Но если вы считаете, что этого недостаточно, то можно сделать так:
    class Element(models.Model):
        vendormodule = models.ForeignKey(VendorModule, on_delete=models.CASCADE)
        info1 = models.TextField(max_length=500)
        info2 = models.TextField(max_length=500)
    Ответ написан
    3 комментария
  • Django. Как получить записи у которых нет бронировании на заданный период?

    @Realmixer
    Full stack Python (Django) web-developer
    Если я вас правильно понял:
    free_vehicles = Vehicle.objects.filter(
        booking__confirmed=False, 
        booking__from_date__gte=datetime_from, 
        booking__to_date__lte=datetime_to,
    )

    Учите матчасть.
    Ответ написан
    Комментировать
  • Не работает кнопка удалить в чем проблема?

    @Realmixer
    Full stack Python (Django) web-developer
    Из того, что бросается в глаза: у вас на странице куча форм с одинаковым ID. Как думаете, какую в таком случае форму отправит код document.getElementById('delete_form').submit()?

    И ещё вы не все данные передаёте в вызов суперметода. Надо так:
    return super().post(request,*args,**kwargs)
    Ответ написан
    5 комментариев
  • Фильтр по объектам модели в templates?

    @Realmixer
    Full stack Python (Django) web-developer
    Во-первых, фильтрация — это бизнес-логика. А бизнес-логике не место в шаблонах. Убирайте эту логику в модели, сервисный слой, ну или хотя бы в контроллеры.

    Во-вторых, в шаблоне вы просто делаете цикл по всем задачам. В то время как по вашему же описанию вам следует делать цикл по статусам, а внутри него вложенный цикл по задачам каждого статуса:
    {% for status in status_list %}
        <h1>{{ status }}</h1>
        {% for task in status.tasks.all %}
            <h2>{{ task }}</h1>        
        {% endfor %}
    {% endfor %}
    Ответ написан
  • Поему не добавляется фавиконка сайта?

    @Realmixer
    Full stack Python (Django) web-developer
    Исправьте ссылку у линка на фавикон:
    <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
    Ответ написан
    Комментировать
  • Как строится Back-End разработкa?

    @Realmixer
    Full stack Python (Django) web-developer
    Full-stack разработчик — это не тот, кто знает всё что угодно, что в принципе может быть на сервере. Технологий и продуктов слишком много, и просто учить всё это по списку не очень дальновидно.

    Full-stack разработчик — это тот, кто разбирается во всем стеке технологий и используемых в проекте компонентов (как в части фронтенда, так и бэкенда), что позволяет ему в одно лицо затащить проект. Соответственно, перечень необходимых технологий, продуктов и инструментов зависит от того, что за проект стоит перед full-stack разработчиком. Исходя из этого я бы не стал приводить "10 things a Full Stack Developer should know".

    Например, вы делаете первые шаги и решили открыть свой "Очередной блог веб-разработчика". И например, вам на фронтэнде до жути надоели фигурные скобочки, или вам друг посоветовал, или просто для разнообразия, но вы решили попробовать Python. Соответственно вы начнёте копать и получите такой стек: React|Vue.JS(раз вы фронтэндер) + Django&DRF|Flask + Virtualenv + uWSGI|Gunicorn + SQLite|PostgreSQL|MySQL + Memcached|Redis(возможно) + Ngix. Соответственно, хотите вы того или нет, но вам придётся всё это хозяйство разворачивать на сервере. А значит вам надо будет научиться работать в Bash и понимать, что вообще куда в *nix-системах (FHS, pipelines, environments, cron, systemd). Вам надо будет суметь организовать процесс разработки, чтобы изменения кода попадали на сервер и применялись. И лучше сразу начинать использовать тесты и системы контроля версий. Если что-то из этого вы не сможете и придётся привлекать кого-то ещё — вы не full-stack разработчик.
    Ответ написан
    Комментировать
  • Static в Django как?

    @Realmixer
    Full stack Python (Django) web-developer
    Если вы запускаете сайт в через runserver, то нужно настроить раздачу статики в режиме разработки.
    Если запускаете по настоящему через uwsgi/gunicorn+nginx, то надо настраивать nginx для раздачи статики.
    Ну и не забывайте про команду collectstatic.
    Ответ написан
    Комментировать
  • Как правильно сделать urls django для ajax запроса?

    @Realmixer
    Full stack Python (Django) web-developer
    С ходу не скажу в чём проблема, но порекомендую батарейку https://pypi.org/project/django-extensions/ — она у меня в каждом проекте по умолчанию. Подключите её, и помимо всякой полезности у вас будет такая management-команда:
    manage.py show_urls
    Думаю всё сразу прояснится!
    Ответ написан
    3 комментария
  • Ошибка сериализации json даных?

    @Realmixer
    Full stack Python (Django) web-developer
    Сериализатор VendorsSerializer в классе CsvToDatabase заточен на приём данных для одного объекта, а вы передаёте в него список объектов. Варианта два: или передавать с фронта на бэк каждый объект отдельным запросом, или делать CsvToDatabase способным обработать список объектов.

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

    Во втором варианте можно сначала проверить все объекты, и лишь в случае успеха сохранить их в БД. Начало может быть примерно таким:
    class CsvToDatabase(APIView):
        def post(self, request, format=None):
            for key, data_item in request.data.items():
                serializer = VendorsSerializer(data=data_item)
                ...
    Ответ написан
    1 комментарий
  • Как добавить запись в модель при изменении или сохранении другой модели?

    @Realmixer
    Full stack Python (Django) web-developer
    Если я правильно понял, вам требуется сигнал без указания sender, который будет срабатывать при сохранении любой модели:
    @receiver(pre_save)
    def event_to_history_annals(sender, instance, **kwargs):
        try:
            Event.objects.create(
                instance=f'{instance._meta.app_label}.{instance._meta.object_name}.{instance.pk}',
                # Всякие другие поля
            )
        except Exception as e:
            logger.exception('Что-то пошло не так...')
    Ответ написан
    Комментировать
  • Как правильно отобразить товары на странице корзины товаров?

    @Realmixer
    Full stack Python (Django) web-developer
    Допустим вы помещаете в корзину ноутбук=5, а затем телефон=5. Но в словаре Cart.cart будет лишь одна запись, потому что ключи одинаковые. Это ошибка раз.

    А теперь смотрите смотрите что у вас будет в переменных, если выполнить подстановку:
    def __iter__(self):
            # перебор элементов корзины и получение их из базы данных
            product_ids = self.cart.keys() # [5]
            # получение объекта товара и добавление его в корзину
            notes = Notebook.objects.filter(id__in=product_ids) # Notebook.objects.filter(id__in=[5])
            phones = Phone.objects.filter(id__in=product_ids) # Phone.objects.filter(id__in=[5])

    Естественно, что будут найдены и телефоны и ноутбуки с id == 5. Это ошибка два.

    На самом деле ошибок здесь больше. Но если вам хочется заставить этот код работать, то присмотритесь к логике работы класса Cart. Например, вы можете заменить ключи на такие:
    product_id = f'{product._meta.app_label}.{product._meta.object_name}.{product.pk}'

    Это потянет изменения во всём классе. Но корзина сможет содержать любые товары с пересекающимися id.
    Ответ написан
  • Выбор логики реализации кода при формировании инстансов из csv файла?

    @Realmixer
    Full stack Python (Django) web-developer
    Вы сейчас отправляете спаршенные данные с бэка на фронт. Ну так стройте на фронте форму подтверждения по этим данным. После нажатия на Confirm шлите эти данные прямо в виде json вновь на бэк. Но уже на другой эндпоинт, который примет эти данные и наделает в что-то в БД.

    PS Вместо filename[-4:] расширение файла лучше получать так: os.path.splitext(filename). Ну или проверку делать так if filename.endswith('.csv').
    Ответ написан
    2 комментария
  • Как выполнить метод из Class Based Views по открытию страницы Django?

    @Realmixer
    Full stack Python (Django) web-developer
    class PostDetailView(DetailView):
        model = Post
        def dispatch(self, request, *args, **kwargs):
            resp = HttpResponse("test response")
            print("test")
            return resp
    Ответ написан
    Комментировать
  • Как во время кодинга легко и быстро заливать измененный код на удаленный сервер, доступный только по SSH?

    @Realmixer
    Full stack Python (Django) web-developer
    Советую использовать IDE PyCharm — в ней есть различные возможности синхронизации локального кода с удалённым сервером, в том числе и по SFTP (SSH), в том числе и автоматически при изменении файлов.

    Ну или, как вариант — Cygwin. В нём с помощью rsync vможно синхронизировать локальный каталог с удалённым. Дичь конечно, но я когда-то так делал )
    Ответ написан
    Комментировать
  • Как динамически отображать query_set() в одном шаблоне?

    @Realmixer
    Full stack Python (Django) web-developer
    У метода get_queryset возможен только один аргумент — self. Чтобы внутри этого метода получить category_slug тебе нужно обращаться к self.kwargs — в этом словаре находятся все переменные, которые ты определил в urls. То есть твой код должен выглядеть примерно так:
    def get_queryset(self):
        self.category = None
        if 'category_slug' in self.kwargs:
            self.category = get_object_or_404(Category, slug=self.kwargs['category_slug'])
            return Product.objects.filter(category=self.category)
        return Product.objects.filter(available=True)
    Ответ написан