Ответы пользователя по тегу Django
  • Как избавиться от дублирования кода?

    @antonksa
    from django.views.generic import View, ListView, DetailView
    
    
    class AddUserPhoneToContextMixin(View):
        def get_context_data(self, **kwargs):
            '''
            Add phone number to context data
            '''
            ctx = super().get_context_data(**kwargs)
            try:
                user = User.objects.get(pk=1)
                ctx['phone_number'] = user.userprofile.phone_number
            finally:
                return ctx
    
    
    class ItemListView(AddUserPhoneToContextMixin, ListView):
        model = Item
        paginate_by = 9
    
    
    class ItemDetailView(AddUserPhoneToContextMixin, DetailView):
        model = Item


    Только не очень понятно почему только pk=1, что будет если его нет, и почему в try-except вы обернули попытку доступа к userprofile. Еще считается, что except без указания конкретных классов обрабатываемых исключений это bad practice. В таком случае вы теряете контроль над пониманием, какое конкретно исключение произошло - то ли коннект в базе оборвался, то ли юзер не существует, то ли поля такого нет у его профиля.

    Хорошая практика - это указывать конкретно что бы обрабатываете:
    try:
        phone_number = user.userprofile.phonenumber
    except UserProfile.DoesNotExists:
        raise NotFound('Warning! User profile did not created!')
    Ответ написан
    3 комментария
  • Неправильная кодировка в при отображении в Django admin?

    @antonksa
    Кодеры на венде должны страдать.
    Ответ написан
    Комментировать
  • Есть ли смысл в разделении основного сайта и его API?

    @antonksa
    вот допустим сколько у вас посетителей в час? 10? 15? Вы представляете себе, какое количество усилий вам придется приложить, чтобы поддерживать две версии кода? Будете названия таблиц джанги вручную выписывать в SQL? Или будуте для алхимии вторую схему держать и синхронизировать ее каждый раз? Не занимайтесь фигней, пара дополнительных ядер сервера и правильно написанные запросы к базе обойдутся значительно дешевле месяцев вашего труда.
    Ответ написан
    Комментировать
  • Как создать таблицу на стороне клиента django?

    @antonksa
    Не храни число в колонне, не храни.
    У его дефолтный nullable в груди...
    Ответ написан
    Комментировать
  • Django: как сделать изменяющийся статус загрузки при помощи Celery?

    @antonksa
    Вы подошли к вопросу не с той стороны. Классический POST не предусматривает чанков и загрузки по частям, поэтому нет смысла пытаться это (ваши статусы) реализовывать со стороны сервера. Все это запросто делается со стороны JS в браузере. Там можно использовать промисы, которые разрезолвятся по окончанию загрузки и вы сможете поменять статус на Success или Failed в зависимости от результата.
    Ответ написан
  • Как создать фильтр из ManyToMany и contains в Django?

    @antonksa
    Кривое у доктора решение.
    Нужно так:
    class Model2(models.Model):
        m2m_field = models.ManyToManyField(to=Model1, related_name='second_models')

    И потом:
    m1 = Model1.object.get(...) #он просто у меня есть
    second_model_queryset = m1.second_models.all()
    Ответ написан
    2 комментария
  • Django. Передача id новой записи в urls?

    @antonksa
    Там в редакторе есть кнопка для вставки кода. То что вы запостили читать без синтаксической подсветки просто лень. Но все зависимости от этого, ваше решение работать не будет.
    Ответ написан
    Комментировать
  • Как правильно в Django вызвать метод get родительского класса CreateView?

    @antonksa
    def get(self, request, **kwargs):
            if not request.user.is_staff:
                raise PermissionDenied
            super().get(request, **kwargs)
    Ответ написан
  • Как переопределить handler500?

    @antonksa
    https://www.django-rest-framework.org/api-guide/ex...

    #  my_project/my_app/utils.py
    
    from rest_framework.exceptions import APIException
    from rest_framework.views import exception_handler
    
    def custom_exception_handler(exc, context):
        # Call REST framework's default exception handler first,
        # to get the standard error response.
        response = exception_handler(exc, context)
    
        # Now add the HTTP status code to the response.
        if response is not None:
            if response.status_code == 500:
                #  My custom 500 error handler.
                pass
        return response


    #  settings.py
    
    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
    }


    ЗЫ. аймсорри, неправильно понял вопрос. Вообще-то если у вас DRF обрабатывает урл, то там по умолчанию и DRF обрабатывает 500, если у вас не так, то вы что-то не так делаете.
    Ответ написан
    1 комментарий
  • Как взять значение value у select (ChoiceField)?

    @antonksa
    Если вам уж так хочется извращений, то
    class ФормаСортировки(forms.Form):
    
        список_цен = [
            ('no', 'не важно'),
            ('little', 'сначала дешёвые'),
            ('big', 'сначала дорогие'),
        ]
        категория = forms.ChoiceField(label= '', initial= 'цена', choices= список_цен)

    вполне разрешено синтаксисом питона.
    Ответ написан
    Комментировать
  • Какие скилы нужны чтобы устроится python программистом?

    @antonksa
    Советую зарегистрироваться на Upwork, разобравшись предварительно как выводить деньги, как платить налоги.
    После этого нужно много и упорно браться за разные проекты, не обязательно помпезные и обильно оплачиваемые.
    Основной задачей будет набивание кармы и, самое главное, приобретение опыта программирования. Как говорит мой знакомый - опыт не триппер, сразу не подхватишь. Думаю через годик, когда вы прокачаете скилл и выйдете на полтора-два килодоллара в месяц не выходя из квартиры, то сможете сам ответить на свой собственный вопрос.

    Ну а там как всегда - трактор, Канада или загнивающая Америка, хотя я бы конечно рекомендовал Европу - домой в гости летать ближе и дешевле. И как-то европейцы к нам ближе по менталитету. Особенно в какой-нибудь Польше или Чехии.

    ЗЫ. Только ничего не бояться. Половина индусов которых выгоняли из проектов, в которых я работал, трудились получая $15-$20 в час и при этом не смогли бы и половины от того, что вы описали.
    Ответ написан
    4 комментария
  • Как провериться на админа в шаблоне Django?

    @antonksa
    Давайте по порядку.

    1. Шаблонизатор джанго. Принимает на вход html (на самом деле не тольк, а любой текстовый файл) и коробку с новогодними подарками (нет) переменными, так называемый контекст. При обработке шаблона шаблонизатор заменяет специальный синтаксис {{ имя_переменной }} которые он ищет в контекстте (контекст это обычный словарь ключ-значение).

    2. User. Юзер это встроенная в джанго модель юзера. Ее можно заменить своей, но 90% используется эта. Middleware авторизации получает объект запроса, перед тем как он будет передан на обработку во View. В 90% случаев опять же используется встроенная миддлварь из модуля django.contrib.auth. Миддлварь ковыряется в куках, находит session_key и ищет в базе данных (в 90% случаев, ну вы понели) какому юзеру соответствует эта сессия. После этого добавляется/модифицируется property экземпляра HttpRequest. Этому аттрибуту присваивается выковырянный из БД экземпляр User или, если юзер не авторизован, AnonymousUser.

    3. View вызывает функцию render которая принимает шаблон и контекст. для сбора контекста у класса View есть метод get_context который собирает контекст в кучу. Даже если вы просто написали самый банальный
    class MyFuckingView(TemplateView):
        template_name = 'some/module/template.html'

    то при обработке get запроса будет вызван get_context из родительского класса TemplateView.

    4. По умолчанию джанга пропихивает в контекст request и еще некоторые вещи ( экземпляр view, который был использован и в зависимости от использованного CBV (class based view) там может быть queryset, object и другие штуки. Еще раз, это встроенный функционал, поэтому если вы модифицируете контекст, то вам всегда нужно вызывать метод родителя, чтобы это не потерялось:
    class MyFuckingView(TemplateView):
        template_name = 'some/module/template.html'
    
        def get_context(self):
            ctx = super().get_context()
            ctx['model_name'] = 'Sasha Grey'
            ctx['category'] = 'Milf anal'
            return ctx


    5. Наконец резюмируя, в вашем случае в контексте должен быть request. is_admin там могло появиться только принудительно. Модифицируйте шаблон:
    {% if request.user.is_admin %}
        <a href="#" class="edit-button">Edit</a>
    {% endif %}

    и все должно заработать. И перечитайте то что я писал выше - туториал по джанго можно осилить за день-два, это очень с одной стороны простой и с другой продуманный и вымученный за 13 лет существования всем сообществом фреймворк.
    Ответ написан
  • Что это за объект {'error_message': "you don't select a choice."}?

    @antonksa
    @muxui
    Это ассоциативный массив.

    Это п...дец.

    Функция render() как я понял, по итогу возвращает ответ в виде JSON'a из массива.

    Вот нахера писать, если вообще не понимаешь о чем???!!!
    Ответ написан
    2 комментария
  • AJAX с DJANGO, что можно, а что нет?

    @antonksa
    Как сказал Сергей - вы на правильном пути. Начните только сразу использовать JS фреймворки, например Vue, это сэкономит вам пару килограммов нервов.
    Ответ написан
    Комментировать
  • Как подключить channels 2 к Django?

    @antonksa
    Лучше используйте aiohttp.

    У меня сделано так:
    1. Юзер подключается к Aiohttp к определенному урлу.
    2. Aiohttp в процессе создание вебсокета дергает системное апи в джанге, получая id юзера.
    3. Если юзер авторизован, то Aiohttp добавляет вебсокет во внутренний реестр соединений. У меня это обычный словарь, где ключом является id юзера. Соответственно при закрытии сокета или его отваливании из реестра он удаляется. Таким образом в любой момент можно получить все открытые сокеты юзера.
    4. Джанга пишет в RabbitMQ ивенты, например SEND_MESSAGE с JSON контекстом (id юзера, текст сообщения и т.д.)
    5. Aiohttp вычитывает сообщения из кролика и пропихивает их в соответсвующие вебсокеты.
    6. Если например нужно подтверждение получения, то Aiohttp не найдя открытого сокета для юзера может дернуть системное апи в джанге, сказав ей, что юзер оффлайн. Также можно организовать системное апи в джанге, куда Aiohttp будет ходить при установлении сокета и проверять на список недоставленных сообщений.
    7. Profit. Тут вообще большое поле для экспериментов, одно могу сказать точно, через год использования Channels еще в 2017 я устал жевать кактус и стал использовать синхронные и асинхронные фреймворки там, где это возможно, прекратив скрещивать ежа и ужа.
    Ответ написан
    Комментировать
  • Аргумент request в функциях Django?

    @antonksa
    Как-то слишком много магии...

    Неужели вы не понимаете, что request не самозарождается внутри функции, как дети в капусте?!

    1. При старте фреймворка джанга ищет все urls.py, вычитывает из них все urlpatterns.
    2. После этого она сохраняет у себя во внутреннем реестре связку урл - функция.
    3. Когда приходит запрос, WSGI вычитывает TCP данные, HTTP данные и формирует WSGIRequest объект всунув в него эту информацию и вызывает главный хендлер джанги.
    4. Хендлер джанги получив этот объект формирует на его основе свой HttpRequest дополняя его джанговскими фичами. После этого находится соответствие урлу и функция обрабатывающаяя этот урл вызывается, с переданным в нее HttpRequest. И кстати не только request. Надо писать:
    def handler(request, *args, **kwargs) -> HttpResponse:
        pass

    потому что джанга может НЕ ТОЛЬКО REQUEST передать в функцию, будете потом тупить, "а почему у меня user_id пишет что не поместилось".

    НЕЛЬЗЯ "№;%% В ВОЗДУХЕ НАПИСАТЬ blabla(request) И ЖДАТЬ ЧТО REQUEST САМОЗАРОДИТСЯ ИЗ НИЧЕГО!!!

    И вообще, у меня сильное ощущение, что вам на три-четыре месяца надо отложить Django и выучить сам питон для начала...
    Ответ написан
    4 комментария
  • Как сделать при debug = false?

    @antonksa
    Как вам написали выше, у вас классическая ошибка новичка в синтаксисе, одинарное = это операция присваивания, двойное == это булева операция проверки на эквивалентность. Поэтому необходимо использовать == вместо =, непонятно почему Ваша IDE не показала Вам ошибку. В чем Вы разрабатываете? Лучше всего использовать PyCharm. И еще как заметили выше Python это объектно-ориентированный язык, в котором практически все является объектом. И в него встроено два специальных объекта - True и False. Поэтому для булевых операций считается хорошим тоном использовать проверку на то, является ли объект результата булевого выражения объектом True или False. Т.к. для этого Python всего лишь сравнивает внутренние ссылки id его объектов, то эта операция чуть-чуть быстрее. Пишется это следующим образом:
    if DEBUG is False:
        ....
    else:
        ....


    Но ради полного перфекционизма ветки необходимо поменять местами, а так как if под капотом делает с условием нечто типа bool(условие) то можно написать вот так:
    if DEBUG:
        # some code if DEBUG is True
    else:
        # some code if DEBUG is False
    Ответ написан
    2 комментария
  • Как првильно настроить django-channels?

    @antonksa
    pip install aiohttp
    Ответ написан
    Комментировать
  • Как сделать отделный домен для каждого юзера?

    @antonksa
    Я бы сделал так:
    1. Как сказали выше example.org ставится nginx'у как условие направления запросов в приложение. Т.е. любой pupkin.example.org и ivanov.example.org уйдут в Джанго на обработку.
    2. Создал модель Company в базе данных с индексируемым полем domain.
    3. Сделал мидлварь, которая наподобие мидлвари ванильной авторизации выковыривает хост из request.META, лезет в базу, находит объект компании и прикрепляет его к запросу
    setattr(request, 'company', company_instance)
    , после этого объект компании можно будет юзать во вьюхах, так же как и юзера:
    request.company
    4. В случае если в имени хоста нету домена третьего уровня, то я бы сделал
    setattr(request, 'main_site', True)
    чтобы во вьюхе можно было понять что это основной сайт, а если поддомен передан, но в базе его нет, то я бы сразу вернул редирект на страницу с инфой, что такой компании не существует, или она заблокирована, или еще что, зарегистрируйтесь и будет вам счастье.
    5. Автоматическое создание поддомена это лишь создание
    Company.objects.create(
        owner=some_user,
        domain=company_domain,
        email=company_email,
        ...
        created=timezone.now()
    )

    , вопрос только в том, будет ли company_domain генерироваться согласно какому-то принципу, или задаваться админом, или юзером при регистрации, или с потолка или рандом, вариантов как звезд на небе, а вопрос слишком обширный, типа "я хочу сделать сайт как фейспук, шо мне делать".
    Ответ написан
    Комментировать
  • Как в django-summernote проверить на пустоту?

    @antonksa
    Гугл по запросу python strip html tags выдает полтора миллиона результатов.
    Ответ написан