【问题标题】:Could not find the variable, namely could not find the key "VariableDoesNotExist at /genres/"找不到变量,即找不到键“VariableDoesNotExist at /genres/”
【发布时间】:2020-04-08 14:32:37
【问题描述】:

我无法获取模板上与 mptt django 模型相关联的对象。查找键 [流派] 失败。我有一个模型链接到另一个模型。我使用 mptt django 使对象通过多对多的关系连接起来。管理面板上一切正常,但在模板上显示对象时会出现此问题。我应该怎么做最好?也许我错误地设置了对象的循环?

models.py:

from django.db import models
from django.urls import reverse
from django.utils import timezone
from mptt.models import MPTTModel, TreeForeignKey, TreeManyToManyField


class Genre(MPTTModel):
    name = models.CharField(max_length=50, unique=True, verbose_name='Подкатегория')
    slug = models.SlugField(max_length=200, null=True, blank=True, unique=True, verbose_name='Nazvanie_kategorii')
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children',
                            verbose_name='Категория')
    is_active = models.BooleanField(default=False, verbose_name='Активность категории')
    created = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата создания записи')
    updated = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата ред-ия записи')

    class MPTTMeta:
        order_insertion_by = ['name']
        verbose_name = 'Тест мптт'
        verbose_name_plural = 'Тест мптт'

    class Meta:
        verbose_name = 'Дерево категорий'
        verbose_name_plural = 'Дерево категорий'

    def __str__(self):
        return '%s' % self.name

    def get_absolute_url(self):
        return reverse('test_mptt:promotion_list_by_category', args=[self.slug])

views.py:

from django.shortcuts import render, get_object_or_404
from .models import Genre, Promotion, PromotionDetails
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def show_genres(request, category_slug=None):
    category = None
    categories = Genre.objects.all()
    promotions = Promotion.objects.filter(is_active=True)
    if category_slug:
        category = get_object_or_404(Genre, slug=category_slug)
        promotions = promotions.filter(category=category)
    return render(request, "genre/list.html", {'category': category,
                                               'categories': categories,
                                               'promotions': promotions})

html模板list.html:(我已经导入了{% load mptt_tags %})

<div class="latest_product_inner row">
    {% for promotion in promotions %}
        <div class="col-md-12">
            <div class="offer_post">
                <div class="offer_details">
                    {% if promotion.site %}
                    <a href="{{ promotion.site }}" target="_blank"><h2>{{ promotion.name }}</h2></a>
                    {% else %}
                    <a><h2>{{ promotion.name }}</h2></a>
                    {% endif %}
                    <p>{{promotion.description|truncatechars:220}}</p>
                    <div class="offer_info text-left">
                        <div class="offer_tag">
                            <a class="active" href="#">{{ promotion.category }}</a>
                        </div>
                        <ul class="offer_meta list">
                            <li><a href="/"><i class="lnr lnr-home"></i> Адрес: {{ promotion.country }}, {{ promotion.region }}, {{ promotion.town }}, {{ promotion.address }}</a></li>
                            {% if promotion.schedule_start and promotion.schedule_end %}
                            <li><a><i class="lnr lnr-clock"></i> Часы работы: {{ promotion.schedule_start|time:'H:i' }} - {{ promotion.schedule_end|time:'H:i' }}</a></li>
                            {% else %}
                            <li><a><i class="lnr lnr-calendar-full"></i> Часы работы: круглосуточно </a></li>
                            {% endif %}
                            {% if promotion.phone %}
                            <li><a><i class="lnr lnr-phone"></i> Телеофон: {{ promotion.phone }} </a></li>
                            {% endif %}
                        </ul>
                    </div>
                    <a href="{{ promotion.get_absolute_url }}" class="white_bg_btn">Подробнее</a>
                </div>
            </div>
        </div>
    {% endfor %}
</div>
<aside class="left_widgets cat_widgets">
    <div class="widgets_inner">
        <ul class="list">
            {% recursetree genres %}
                <li>
                    <a href="{{ node.get_absolute_url }}">{{ node.name }}</a>
                    {% if not node.is_leaf_node %}
                        <ul class="list">
                            <li><a href="#">{{ children }}</a></li>
                        </ul>
                    {% endif %}
                </li>
            {% endrecursetree %}
        </ul>
    </div>
</aside>

错误日志:

【问题讨论】:

    标签: python django python-3.x django-templates django-mptt


    【解决方案1】:

    html 模板包含这一行:

    {% recursetree genres %}
    

    所以模板期望看到一个名为genres的变量。

    在视图函数中你有这个渲染调用:

    return render(request, "genre/list.html", {'category': category,
                                               'categories': categories,
                                               'promotions': promotions})
    

    您没有将名为 genres 的变量传递给模板。

    【讨论】:

    • 天哪,我多么讨厌自己。非常感谢您的提示!一切都变好了! {% 递归树类别 %}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2019-11-22
    • 2016-04-30
    • 2020-07-06
    • 2021-03-25
    相关资源
    最近更新 更多