Ответы пользователя по тегу Django
  • Почему не работает 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
    Предлагаю такую схему:
    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 %}
    Ответ написан
  • 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
    Ответ написан
    Комментировать
  • Как динамически отображать 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)
    Ответ написан
  • Автоматически присваивать автора с модели?

    @Realmixer
    Full stack Python (Django) web-developer
    В процессе обработки формы перед сохранением статьи назначайте ей текущего пользователя:
    article.user = request.user
    article.save()
    Ответ написан
    3 комментария
  • Можно ли хранить в БД набор изображений?

    @Realmixer
    Full stack Python (Django) web-developer
    Напишите модель изображения, связанную с основной. У этой модели кроме ImageField можно добавить название, описание, сортировочный индекс и т.д. Как правило эти дополнительные данные всегда нужны.

    class Photoalbum(models.Model):
        ...
    
    class PhotoalbumImage(models.Model):
        photoalbum = models.ForeignKey(Photoalbum, ...)
        image = models.ImageField('изображение', ...)
        ...
    Ответ написан
    Комментировать
  • Как пройти аутентификацию CSRF?

    @Realmixer
    Full stack Python (Django) web-developer
    Используйте метод GET. Если же необходим именно метод POST, то добавляйте значение csrfmiddlewaretoken равное куке csrftoken. В вашем случае в функции ajaxTest добавить:

    data['csrfmiddlewaretoken'] = $.cookie('csrftoken');

    Здесь для примера используется древний плагин jquery.cookie. Лучше найти что-то поновее.
    Ответ написан
    Комментировать
  • Как инкрементировать переменную в бд?

    @Realmixer
    Full stack Python (Django) web-developer
    Лучше стараться уходить от циклов в коде, если есть возможность выполнить анализ данных и их изменение на уровне базы данных за минимум транзакций (хотя разумеется есть исключения):

    from django.db.models import F
    
    UserAttribute.objects.filter(energy__lt=100).update(energy=F('energy') + 1)

    Здесь выполнится два sql-запроса:
    1. Первый отберёт нужные экземпляры UserAttribute.
    2. Второй выполнит добавление единицы к energy у каждого экземпляра. Причём произойдёт это за один запрос. Причём база выполнит команду "добавь к имеющемуся energy единицу" вместо "запиши в energy 42".

    Вариант же с отдельными операциями "запрос / анализ / обновление" допускает возникновение ошибочных данных, когда в промежутке между операциями кто-то другой тоже обновит данные. Тогда кто последний сделает запись — то значение и будет в БД.
    Ответ написан
    Комментировать