• Members 8 сообщений
    15 июня 2021 г. 17:07

    Доброго времени суток. Помогите пожалуйста разобраться в чём проблема.
    В методе get, делаю как в видео products = LatestProducts.objects.get_products_for_main_page('notebook', 'smartphone'), но у меня почему-то на главную выводит только те продукты, которые относятся к модели второго и последующих аргументов. Т.е. в данном случае выводятся только смартфоны, если их поменять местами, выводятся только ноутбуки, если передать один аргумент, то ничего не выводится. Если передать три аргумента, например ('notebook', 'smartphone', 'notebook'), то выводятся продукты, которые относятся к смартфонам и ноутбукам. Почему-то не хочет отображать продукты из первого агрумента.
    В чём может быть причина?

    class BaseView(View):
    
        def get(self, request, *args, **kwargs):
            categories = Category.objects.get_categories_for_main_menu()
            products = LatestProducts.objects.get_products_for_main_page('notebook', 'smartphone')
            context = {
                'categories': categories,
                'products': products
            }
            return render(request, 'base.html', context)
    
            <!-- Section-->
            <div class="row">
                {% for product in products %}
                <div class="col-lg-4 col-md-6 mb-4">
                    <div class="card h-100">
                        <a href="{{ product.get_absolute_url }}"><img class="card-img-top" src="{{ product.image.url }}"alt=""></a>
                        <div class="card-body">
                            <h4 class="card-title">
                                <a href="{{ product.get_absolute_url }}">{{ product.title }}</a>
                            </h4>
                            <h5>{{ product.price }} руб.</h5>
                        </div>
                    </div>
                </div>
                {% endfor %}
            </div>
    
    class LatestProductsManager:
    
        @staticmethod
        def get_products_for_main_page(self, *args, **kwargs):
            with_respect_to = kwargs.get('with_respect_to')
            products = []
            ct_models = ContentType.objects.filter(model__in=args)
            for ct_model in ct_models:
                model_products = ct_model.model_class()._base_manager.all().order_by('-id')[:5]
                products.extend(model_products)
            if with_respect_to:
                ct_model = ContentType.objects.filter(model=with_respect_to)
                if ct_model.exists():
                    if with_respect_to in args:
                        return sorted(
                            products, key=lambda x: x.__class__._meta.model_name.startswith(with_respect_to), reverse=True
                        )
            return products
    
  • Team
    15 июня 2021 г. 17:34

    Вот тут проблема. Сможете сразу сказать в чем именно?

  • Members 8 сообщений
    15 июня 2021 г. 19:17

    Нет. Не смогу.

  • Members 8 сообщений
    15 июня 2021 г. 19:18

    self не нужно передавать в качестве аргумента?

  • Team
    15 июня 2021 г. 19:19

    Вы мне скажите :)

  • Members 8 сообщений
    15 июня 2021 г. 19:32

    Без self работает. Спасибо за подсказку)

  • arrow_forward

    Тема была перемещена из Вопросы по Django.

  • Members 4 сообщения
    24 июня 2021 г. 9:07

    Добрый день. Застрял и не могу найти где ошибся
    TypeError at /
    Complex annotations require an alias
    Request Method: GET
    Request URL: http://localhost:8000/
    Django Version: 3.2.4
    Exception Type: TypeError
    Exception Value:
    Complex annotations require an alias
    Exception Location: C:\shop\env\lib\site-packages\django\db\models\query.py, line 1111, in _annotate

  • Team
    24 июня 2021 г. 13:38

    Во-первых, не надо мусорить - все в одну тему писать. Создавайте отдельную тему. Во-вторых - вставляйте удобочитаемый код.