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

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    В данном случае достаточно, кто помогал спасибо!
    def test_action_after_save(self):
            """Тест action_after_save"""
            with self.assertLogs('Send mail', level='ERROR'):
                action_after_save(instance=None)
    Ответ написан
    Комментировать
  • Ошибка сохранения после переопределения метода POST в DJANGO?

    sergey_1990
    @sergey_1990
    1
    А что сделать пытаетесь? То что сейчас это совсем как то изващенно, я даже не разобрал идею!
    Ответ написан
  • Не работают url ссылки. NoReverseMatch at /about/?

    sergey_1990
    @sergey_1990
    1
    Коллеги правильно написали, в Вашем случае или
    {% url 'lang:about' %}
    или уберите пространство имён если проект небольшой и нет дублей имён
    path('', include('lang.urls')),
    Ответ написан
    Комментировать
  • Изображения из models не выгружаются на сайт. Как указать сбор данных с родительского каталога, относительно public_html?

    sergey_1990
    @sergey_1990
    1
    Ошибка здесь
    {% for el in equipment %}
       <img src="{{ el.logo }}" alt="{{ el.title }}">
    {% endfor %}

    НУЖНО
    {% for el in equipment %}
       <img src="{{ el.logo.url }}" alt="{{ el.title }}">
    {% endfor %}

    Повнимательнее прочитал вопрос, ОЧЕНЬ странная структура каталогов, а settings.py раздел MEDIA в можно увидеть? и джанго комфортней на VDS работать
    Ответ написан
    2 комментария
  • На сколько производительна связка react + django через axios и rest по сравнению с другими связками?

    sergey_1990
    @sergey_1990
    1
    Ваш реакт всё равно скомпилируется в JS, как и babel но объём будет больше, есть реактивная библиотечка solid js и по ресурсам она гораздо выгоднее реакта,! А если посмотреть в сторону ресурсов то я бы выбрал связку solid JS+ Salvo rs (Rust) это будет в разы шустрее при минимум ресурсов
    Ответ написан
    Комментировать
  • Передать переменную из метода в шаблон html в "Django"?

    sergey_1990
    @sergey_1990
    1
    Так запиши ее в атрибут класса и отдай в контекст
    class ViewClass(Base):
    
        some_var=""
    
    
        def get_initial(self): 
            profile = Profile.objects.get(user=self.request.user)
            initial = super(konkurs_resultNew_record, self).get_initial() #
             ..........
            except:
                self.some_var = "Ошибка"
            return initial
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context["some_var"] = self.some_var

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

    sergey_1990
    @sergey_1990
    1
    Вот пример с годом постройки, ввиду контекста приложения здесь models.IntegerField, но это по аналогии можно и для дат сообразить
    from django.core.validators import MaxValueValidator, MinValueValidator
    
    class Unit(models.Model):
        """модель объекта недвижимости"""
        year_construction = models.IntegerField(verbose_name='Год постройки', choices=year_choices(),null=True, blank=True, validators=[MinValueValidator(1950), max_value_current_year])
    
    def current_year():
        return datetime.date.today().year
    
    def max_value_current_year(value):
        return MaxValueValidator(current_year())(value)
    
    def year_choices() -> List:
        return [(r,r) for r in range(1950, datetime.date.today().year+1)]
    Ответ написан
    Комментировать
  • Как сделать форму в django admin с initial полями?

    sergey_1990
    @sergey_1990
    1
    В классе админ
    def get_form(self, request, obj=None, **kwargs):
            form = super(<<ClassName>>, self).get_form(request, obj, **kwargs)
            И  делай здесь что нужно как с обычной формой .....
            #if request.GET and request.GET['product_id']:
              #product_id = request.GET['product_id']
              #product = Product.objects.get(id=product_id)
              # form.base_fields['delivery_add'].initial = request.user.address
            return form
    Ответ написан
    Комментировать
  • Где создать общую асбтрактную модель в Django?

    sergey_1990
    @sergey_1990
    1
    Я обычно создаю приложение pages и туда всю общую логику уношу, например контакты, обработку типовых типовых страниц, 404, миксины для моделей, админки, форм, теги, фильтры и тд..
    Ответ написан
    Комментировать
  • Как подключить Yandex Smart Captcha на сайт Django?

    sergey_1990
    @sergey_1990
    1
    Ответ На Ваш вопрос из реального проекта
    views.py
    def get_client_ip(request):
        """получение IP пользователя"""
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip
    
    
    def check_captcha(token,request):
        """проверка токена капчи"""
        guest_ip = str(get_client_ip(request))
        resp = requests.get(
            "https://captcha-api.yandex.ru/validate",
            {
                "secret": settings.YACAPCHA_SERVER,
                "token": token,
                "ip": guest_ip  # Нужно передать IP пользователя.
                                   # Как правильно получить IP зависит от вашего фреймворка и прокси.
                                   # Например, в Flask это может быть request.remote_addr
            },
            timeout=1
        )
        server_output = resp.content.decode()
        if resp.status_code != 200:
            print(f"Allow access due to an error: code={resp.status_code}; message={server_output}", file=sys.stderr)
            return True
        return json.loads(server_output)["status"] == "ok"
    
    class RequestWithCapchaCreateAPI(generics.CreateAPIView):
        """общий класс для проверки каппчи"""
        def create(self, request, *args, **kwargs):
            captchaToken = request.POST['smart-token']
            if check_captcha(captchaToken,request):
                return super().create(request, *args, **kwargs)
            else:
                return  JsonResponse({'status':'false','message':'ROBOT'}, status=423)
    
        def perform_create(self, serializer):
            subdomain = get_subdomain(self.request)
            serializer.save(subdomain=subdomain)
    
    class CallRequestCreateAPI(RequestWithCapchaCreateAPI):
        """создание запроса на звонок"""
        serializer_class = CallRequestSerializer

    settings.py
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [BASE_DIR/ 'templates'], # add for index (templates),
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'wellway_system.context_processors.debug',
                    'wellway_system.context_processors.capcha', #Капчу в общий контекст
                ],
            },
        },
    ]
    # Для yandex capcha
    SECURE_REFERRER_POLICY = 'no-referrer-when-downgrade'
    YACAPCHA_CLIENT = '...........' #Ключ клиента
    YACAPCHA_SERVER = '...........' #Ключ сервера

    context_processors.py
    from django.conf import settings
    
    def capcha(context):
      return {'YACAPCHA_CLIENT': settings.YACAPCHA_CLIENT}


    В шаблоне в подключаем
    <script src="https://captcha-api.yandex.ru/captcha.js?render=onload&onload=onloadFunction" defer></script>

    В шаблоне в конце подключаем
    <script>
    		function onloadFunction() {
    		  if (window.smartCaptcha) {
    			const containers = document.querySelectorAll('#captcha-container');
    			containers.forEach(function (container) {
    			  const widgetId = window.smartCaptcha.render(container, {
    				sitekey: "{{ YACAPCHA_CLIENT }}",
    			  });
    			  container.dataset.widgetid = widgetId
    			})
    		  }
    		}
    	  </script>

    в форму включаем
    <div style="height: 100px" id="captcha-container" class="smart-captcha"></div>

    ну и в скриптах везде по-разному но смысл один делаем ресет кода капчи например
    function formSent(form, responseResult = ``) {
                document.dispatchEvent(new CustomEvent("formSent", {
                    detail: {
                        form
                    }
                }));
                setTimeout((() => {
                    if (flsModules.popup) {
                        const popup = form.dataset.popupMessage;
                        popup ? flsModules.popup.open(popup) : null;
                    }
                }), 0);
                formValidate.formClean(form);
                formLogging(`Форма отправлена!`);
                let widget = form.querySelector("#captcha-container");
                let widgetId = widget.dataset.widgetid;
                smartCaptchaReset(widgetId);
            }

    Вроде всё написал, удачи))
    Ответ написан
    1 комментарий
  • Как выполнят отладку и переход внутри установленных пакетов pip при работе c django в docker?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    Ответ Dev Containers есть и в vscode и пайчарме, можно работать
    Ответ написан
    Комментировать
  • Почему не выводятся поля на html из forms.py?

    sergey_1990
    @sergey_1990
    1
    views.py
    return render(request, 'main/create.html')--- Здесь контекст не передали в рендер!

    return render(request, 'main/create.html', context)


    https://docs.djangoproject.com/en/4.2/topics/http/...
    Ответ написан
    Комментировать
  • Как правильно привязать модель с комментариями к разным моделям?

    sergey_1990
    @sergey_1990
    1
    https://docs.djangoproject.com/en/4.2/ref/contrib/... -- Generic relations ТЕБЕ СЮДА
    Ответ написан
    Комментировать
  • Как отменить подстановку языка из HTTP_ACCEPT_LANGUAGE в django 4.2?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    Я рассматривал вариант промежуточного ПО, которое чистит HTTP_ACCEPT_LANGUAGE, но это грубовато, и ответы 13 лет, если это изменение в уже свежих версиях, есть же объяснение этому,
    В ИТОГЕ, чтобы не буксовать на месте и не менять остальной код, добавил midleware который чистит этот заголовок, всё заработало, буду искать более правильное решение!
    class FixLangMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            if "HTTP_ACCEPT_LANGUAGE" in request.META:
                del request.META["HTTP_ACCEPT_LANGUAGE"]
            response = self.get_response(request)
            return response

    и в settings.py
    MIDDLEWARE = [
        "pages.middlewares.FixLangMiddleware",  
    
    .....
    Ответ написан
  • Как заставить работать Yandex SmartCaptcha в приложениях DJANGO?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    Сам нашёл ответ, django генерирует много разных заголовков, в том числе Referrer-Policy: same-origin и Cross-Origin-Opener-Policy: same-origin, на сервис Yandex SmartCaptcha влиял Referrer-Policy: same-origin, установив его Referrer-Policy: no-referrer-when-downgrade, сервис заработал! Думаю кому-нибудь это поможет! в settings.py
    # Для yandex capcha
    SECURE_REFERRER_POLICY = 'no-referrer-when-downgrade'
    Ответ написан
    1 комментарий
  • Почему django runserver очень долго обрабатывает запросы, как ускорить?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    ЭТО django_debug_panel вызывала дикие тормоза !!!! РЕЖИМ DEBUG = False и всё летает, или чтоб и DEBUG = True и панель не удалять а включать ее только когда нужно
    DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda r: False, # disables it
    # '...
    }
    Ответ написан
    Комментировать
  • Как использовать свои разрешения в django?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    РАЗОБРАЛСЯ САМ
    class ContractorAdmin(admin.ModelAdmin):
        model = Contractor
        list_display = ('__str__', 'phone', 'site','verified')
        inlines = (ProductListInline,)
    
        def get_queryset(self, request):
            """Ограничиваем выдачу списка поставщиков"""
            queryset = super().get_queryset(request)
            if request.user.has_perm('orders.only_not_verified') and not request.user.is_superuser:
                return queryset.filter(verified=False)
            return queryset
    Ответ написан
    Комментировать
  • Как отправить на фронтенд url картинки заглушки, если поле ImageField пустое?

    sergey_1990
    @sergey_1990 Автор вопроса
    1
    class CustomUserModelSerializer(serializers.ModelSerializer):
        """give all users"""
        status = serializers.SerializerMethodField()
    
        class Meta:
            model = CustomUser
            fields = ('id', 'email', 'name', 'status', 'avatar')
    
        def get_status(self, obj):
            if obj.is_active == True:
                status = 'active'
            else:
                status = 'inactive'
            return status
    
        def to_representation(self, instance):
            response = super().to_representation(instance)
            if not instance.avatar.name:
                request = self.context.get('request')
                response['avatar'] = request.build_absolute_uri("/media/images/avatar-test.jpg")
            return response


    вот рабочий сериализатор, спасибо за ответ, который дал нужное направление!
    Ответ написан
    Комментировать