Доступ к словарю с ключом по объекту в шаблоне django - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь получить доступ к значениям dict в моем шаблоне django. Ключи диктовки - это объекты. Вот фрагмент моей кодовой базы:

models.py

class ProductCategory(models.Mode):
    name = models.CharField(max_length=64, blank=False, null=False, unique=True)
    slug = models.SlugField(blank=False, null=False, unique=True)

class Product(models.Model):
    category = models.ForeignKey(ProductCategory, on_delete = models.CASCADE)

    # other fields
    pass

    def __str__(self):
        return self.title

views.py

def index(request):
    products = Product.objects.all()
    categorized_products = {}

    for p in products:
        prod_category = p.category
        temp = categorized_products.get(prod_category,[])
        temp.append(p)
        categorized_products[prod_category] = temp

    context = {'products_dict': categorized_products, 'categories': categorized_products.keys() }

    return render(request,'product/index.html', context=context)

mytemplate. html (соответствующий фрагмент)

            <div class="tab-content">
                {% for category in categories %}
                {% if not forloop.counter0 %}
                <div class="tab-pane fade in active" id="{{ category.slug }}">  
                {% else %}                  
                <div class="tab-pane fade in" id="{{ category.slug }}">
                {% endif %}
                    <div >
                        <h4>{{ category.description }}</h4>
                        <div class="container-fluid"> 
                            <div class="row">                                                                  
                                <div class="col-md-3"  style="border:1px solid red;">
                                {% for product in products_dict.category %}
                                    {{ product }}
                                {% endfor %}

Когда я выполняю код с помощью отладчика, я вижу, что переменная products_dict является точной и правильно заполнена представлением. Однако когда я запускаю код, код for loop не выполняется.

Точно так же, когда я запускаю тот же код, который у меня есть в views.py в оболочке, dict корректно заполняется, поэтому я знаю, что в базе данных есть данные и что полученные данные правильно передаются в шаблон django.

Так почему я не могу получить доступ к значению dict в шаблоне и почему продукт не отображается в мой шаблон?

1 Ответ

2 голосов
/ 04 марта 2020

Простой ответ заключается в том, что Django шаблоны этого не делают. Точечная ссылка в переменных шаблона выполняет поиск в словаре (помимо прочего), но не на основе значения имени другой переменной:

Обратите внимание, что «bar» в выражении шаблона, например {{foo.bar}} будет интерпретироваться как литеральная строка без значения переменной «bar», если она существует в контексте шаблона.

https://docs.djangoproject.com/en/3.0/ref/templates/language/#variables

* 1011 Как правило, я бы решил эту проблему, организовав что-то итеративное для непосредственного существования значений category, вместо того, чтобы пытаться использовать объект категории в качестве ключа dict. Это может быть обратный менеджер FK:

{% for product in category.products_set.all %}

Или что-то, что я устанавливаю для объектов категории в памяти в представлении, если мне нужно преобразовать или отфильтровать продукты по категориям :

categories = ProductCategory.objects.all()
for category in categories:
    category.products = [transform_product_somehow(product) for product in category.products_set.all()]

(Опционально с использованием fetch_related для предварительной выборки товаров категории вместо выполнения дополнительного запроса по категории.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...