• Как запретить смену цвета на сайте?

    @ilya_chch
    тот момент, когда ты, используя dark reader, читаешь, как бы это запретить=)
    (благо, он не делает invert, который еще и пц ест нормально)
    5fe65cee305f0644831480.png

    а если по делу - я бы проследил, что опера добавляет на страницу и попробовал отследить, например, при загрузке (тот же dark reader добавляет в head несколько тегов style, которые легко находятся)
  • Есть ли какое-то преимущество в использовании декоратора для моделей содержащих ImageField?

    @ilya_chch
    Mikkkch, Извините, не хотел задеть

    Мне кажется подобный декоратор был использован чтобы динамически задать место для сохранения файлов. И применялся он к моделям, в которых это поле уже есть. В рантайме оно переопределялось полем, в котором upload_to указывает на место исходя из названия модели.

    поскольку при наследовании сложно привязаться к классу модели-наследника

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

    И сдается мне, что это было сделано для унификации.
    Если вернуться к вопросу, есть ли смысл - мне кажется, если у вас много моделей с одинаковой логикой работы с изображениями - почему нет. Но если таких моделей всего пара, я бы работал с каждым таким полем отдельно. Плюс, можно более точно задать их поведение. Возможно, постобработку какую-то, или динамическое место сохранения (по пользователю, времени или ещё как-то)
  • Есть ли какое-то преимущество в использовании декоратора для моделей содержащих ImageField?

    @ilya_chch
    Mikkkch,

    5fd4c02655510610632682.png

    сами то этот код пробовали?

    1) декоратор должен что-то вернуть. у вас он этого не делает
    сделать его, как минимум
    def contain_photos(model):
        upload_path = model.__name__.lower() + 's'
        image_field = models.ImageField(upload_to=upload_path)
        setattr(model, 'photo', image_field)
        return model

    это будет работать, но только в рантайме

    2) в миграции это поле не будет отображено, т.к. изменения моделей собираются статически

    5fd4c1eb9a6bf880721736.png
  • Есть ли какое-то преимущество в использовании декоратора для моделей содержащих ImageField?

    @ilya_chch
    1) изучите, как работают декораторы (спойлер: не так)
    2) изучите, что такое наследование в ООП
    3) изучите, как работает наследование моделей в Django
  • На каком движке лучше сделать доску обьявлений с кабинетами пользователей?

    @ilya_chch
    а я бы делал такое на django или на laravel (в зависимости от того, что можешь=) )
  • Как описать Generic класс?

    @ilya_chch Автор вопроса
    Алан Гибизов, при аннотации типов используется такая нотация
    можно почитать тут: https://docs.python.org/3/library/typing.html

    payload_class: Type[ServicePayload] = ServicePayload

    означает, что описываемая переменная будет с типом "класс ServicePayload".
    если бы было
    payload_class: ServicePayload = ServicePayload()
    ожидалось бы, что в переменную должен быть помещен экземпляр класса

    так же, как и с другими подобными описаниями:
    items: List[str]
    будет ожидать, что в переменной будет список строк

    или
    items: List[Union[str, int]]
    список строк или чисел (принимается вариант ['a', 1, 'b', 42], но будет ошибка, если будет передано ['a', 3.14])

    TypeVar используется, чтобы создавать свои "кастомные" типы и использовать их, например в следующем виде:
    T = TypeVar('T')
    
    def enum(iterable: Iterable[T]) -> Tuple[int, T]:
        ...

    то есть, если передать в данную функцию итерируемый объект с объектами типа str, вернется (int, str), а если передать итерируемый объект с объектами int - вернется (int, int)
  • Как исправить неверный вывод request.user в django?

    @ilya_chch
    1) с шифрованием прям нормально справляется джанговый PasswordField, причем еще и выбор алгоритма есть и возможность написать свой алгоритм - никто не запрещает, чо уж
    2) если упороться и сделать двустороннее шифрование, типа получается пользователь по логину, расшифровывается пароль, сравнивается с введеным - это будет отдельный шедевр. любое шифрование и дешифрование - CPU bound процесс (ибо математика). следвательно, даже если запустить все это в 10 воркеров, я, подобрав логин по времени ответа, смогу запустить 11 процессов, которые будут долбить с нужным логином и всяким мусором в пароле и все, сайт прилег
    3) нет, уникальности логина НЕ видно исходя из
    login = models.CharField(max_length=100, verbose_name="Логин", blank=False, default="NULL")

    где нет "unique=True". а строковый "NULL" - это вообще прекрасно. Если хотябы открыть документацию, там найдется, что а) строковые поля не стоит делать nullable - придется разруливать проблемы, когда в одной строке будет None, а в другой '' б) при все том же создании пользователей, если не будет указан login - новые пользователи будут все с login="NULL". и как с этим жить - непонятно
    в случае, если будут создаваться логины-пароли не через веб, а из консоли или каким либо другим образом, эти "if" - не спасут
    4) тут проверяется, что login есть в базе, но не проверяется его уникальность
    5) зачем выделять отдельный файл на форму?

    избавляясь от шифрования пароля автоматически пропадает возможность правильно сравнивать пароли за константное время. что открывает дверь для подбора пароля

    по поводу лучшего контроля над кодом:
    class AuthForm(forms.ModelForm):
        def __init__(*args, **kwargs):
            self.user = None
            super().__init__(*args, **kwargs)
    
        def clean():
            cleaned_data = super().clean()
            self.user = authenticate(cleaned_data['login'], cleaned_data['password'])
            if not self.user:
                self.add_error('password', 'Password is incorrect')
            return cleaned_data
    
        class Meta:
            model = get_user_model()
            fields = ('login', 'password')
    
    def auth(request):
        form = AuthForm(request.POST or None)
        if form.is_valid():
            login(request, form.user)
            return redirect('...')
        return render(request, 'template.html', {'form': form, ...})

    где здесь недостаточно контроля за кодом?

    Хотя, возможно (только возможно), хочется прям все реализовать самому. Ок. Только зачем тогда Django?
    Фигачь на фласке или чем-нибудь модном, типа FastAPI. Хочешь джаговый ОРМ - peewee

    а вообще, для лучшего контроля над кодом, надо читать исходники - будешь понимать, как это работает, не будешь бояться это использовать
  • Как исправить неверный вывод request.user в django?

    @ilya_chch
    1) почему храните пароль в открытом виде?
    2) почему логин, раз уж до этого дошло, не уникальный?
    3) почему не используете формы?
    4) зачем перебирать пользователей если authenticate возвращает найденного по login-password пользователя или None, если ничего не нашел?

    при создании авторизации отказался от велосипеда LoginView

    если все сделать правильно, а не писать свои велосипеды, LoginView будет занимать около 5-6 строк и работать будет куда эффективнее и быстрее
  • Как архивировать файлы без каталогов с помощью Python?

    @ilya_chch
    а что, если создать временную папку, в которую складывать копии файлов, которые были найдены при обходе
    а потом уже пройтись по ней и все содержимое сложить в архив?
  • Как аннотировать тип классового атрибута, который будет переопределен?

    @ilya_chch Автор вопроса
    Daniil Markelov, Подскажите, версии пакетов такие?
    Python 3.8.2
    Mypy 0.770
    Pydantic 1.6.1
  • Как оформить Python приложение для публикации в pypi и использовании в качестве CLI утилиты?

    @ilya_chch Автор вопроса
    Спасибо, хорошее объяснение!
    Не могли бы вы еще подсказать, где прочитать про организацию кода на уровне файловой системы - сколько примеров не видел, все делают по своему. Кто-то чуть более понятно, кто-то менее, но хоть сколько-нибудь единого формата я как-то не смог найти
  • Как настроить 2 БД в Django?

    @ilya_chch Автор вопроса
    добавил в роутер баз
    if db == 'default':
    if app_label == 'admission':
    return False
    elif model and model._meta.app_label == 'admission':
    return False
    и наконец заработало нормально. правда приходится запускать 2 миграции (с указание приложения, которое использует не default и для остальных), но уже намного меньше проблем
  • Чем можно обрабатывать шаблон Open Document Format?

    @ilya_chch Автор вопроса
    Насколько я понял, в reportlab можно взять готовый "шаблон" и в нужные места вписать нужные данные? если так, то есть ли там возможность по каким-либо меткам или плейсхолдерам расставить значения?
  • Как разделить модель на несколько блоков в админке?

    @ilya_chch Автор вопроса
    это безусловно, но вопрос не об этом.