Ответы пользователя по тегу Django
  • Стоит ли использовать get_user_model(), когда есть кастомная модель пользователя?

    @ilya_chch
    ничего страшного, если вы будете ее использовать, не случится
    но вообще, get_user_model() надо использовать, если вы пишете библиотеку для Django - поскольку неизвестно, будет ли пользовательская модель переопределена в проекте, куда эту библиотеку поставят

    но, если вы используете type hinting, функцию использовать нельзя, придется делать:
    from typing import TYPE_CHECKING
    
    if TYPE_CHECKING:
        from ... import User
    
    
    def some_func(user: 'User') -> 'User':
        ...
    Ответ написан
    Комментировать
  • Как использовать UUID в url без тире?

    @ilya_chch Автор вопроса
    решил вопрос через
    force_str(urlsafe_base64_encode(force_bytes(uuid)))


    и обратно в uuid:
    force_str(urlsafe_base64_decode(encoded_uid))
    Ответ написан
    Комментировать
  • Как вызвать функцию в шаблоне?

    @ilya_chch
    если это система лайков, то я бы предложил написать простенький API эндпоинт, и JavaScript-ом отправлять туда POST запрос, в котором передавать id. если лайка нет и он успешно создался, API отдает статус 201 и что-нибудь типа {'like': 'OK'} и кнопка как-то изменяется. Если лайк был поставлен, лайк удаляется и возвращается статус 204 и ответ типа {'like': 'REMOVED'}.

    ну а по поводу постановки вопроса - изначально под выполнение функции в шаблоне больше всего подходят шаблонные тэги. Но они выполняются во время рендеринга страницы.

    если API - не ваш вариант, можно сделать RedirectView, а кнопку, которая должна выполнять эту функцию повесить ссылку на эту вьюху. в методе get_redirect_url пишешь свою логику и вертаешь тот же url, с которого пришло через request.META.HTTP_REFERER
    Ответ написан
    Комментировать
  • Django Rest Framework: Для чего используется SCHEMAS?

    @ilya_chch
    Это используется для того, чтобы не хардкодить поля формы.
    Например, в случае изменения модели, требует изменения фронта, чтобы добавить, изменить или удалить поле.

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

    @ilya_chch Автор вопроса
    Как выяснилось, самый простой и надежный способ - Сделать второй сериализатор, который бы отдавал все объекты. а в представлении переопределить метод get_serializer, который бы подсовывал нужный сериализатор
    Ответ написан
    Комментировать
  • Как сделать formset для нескольких объектов БД?

    @ilya_chch Автор вопроса
    Нашел решение, может кому будет полезно:
    class ForeignObjFormSet:
        def get_form_kwargs(self, index):
            kwargs = super(ForeignObjFormSet, self).get_form_kwargs(index)
            kwargs['obj'] = self.form_kwargs['obj'][index]
            return kwargs
    
    # Во вьюхе
    def view(request):
        target_objects = Obj.objects.filter(foreign_obj__isnull=True)
        FormSet = formset_factory(forms.ForeignObjForm, formset=ForeignObjFormSet, extra=target_objects.count())
        form_set = FormSet(form_kwargs={'obj': list(target_objects)})
    # ...
    Ответ написан
    Комментировать
  • Как настроить 2 БД в Django?

    @ilya_chch Автор вопроса
    получилось обойти ошибку с помощью
    $ python manage.py migrate --fake
    теперь Django думает, что миграции сделаны и ошибки нет, однако хотелось бы попробовать найти решение, чтобы можно было просто запускать migrate и не париться
    Ответ написан
    Комментировать
  • Как организовать хранение файлов пользователей в Django?

    @ilya_chch
    в settings.py добавьте указание на расположение медиа
    MEDIA_URL = '/media/' #например
    MEDIA_ROOT = '/srv/files/media' #например


    media_url - часть урла, по которому будут находиться картинки, media_root - место на сервере, где nginx будет их искать.

    в модели:

    class ModelClass(models.Model):
        <поле> = models.ImageField(upload_to=rename_image, blank=True, verbose_name='...')
    
    def rename_image(instance, filename):
        image_name = md5(str(time.time()).encode()).hexdigest()
        image_type = filename.split('.')[-1]
        return 'imgs/{}.{}'.format(image_name, image_type)


    rename_image в моем случае переименовывает загружаемую картинку в хэш. и в return можно добавить путь. в моем случае будет загружаться в media_root/imgs/<что-то>.jpg #например (при условии, что media_root определен, все всегда будет падать туда)

    добавьте в путь подкаталог с именем user_{его id}. а вот насчет доступности только для этого пользователя - надо отдельно думать.
    Ответ написан
    Комментировать