为什么将参数传递给 parent 模板会使 child 模板无法使用它们

Why passing arguments to parent template makes the child template not be able to use them

我正在为学校网站制作一个 django 项目

我有一个 base.html 作为 child 模板的 parent 模板,它是每个页面的内容

base.html 包括带有学校徽标的导航栏和标题为 "Units"

的部分

这是呈现讲师页面的代码

views.py . .

def lecturer_home(request):
    user = request.user

        query for the user first name and full name
        query for the units that the user is teaching and their teaching 
        period in unit_list and period_display


        class_display = zip(unit_list, period_display)
        user_dict = {
        'f_name' : user.first_name,
        'fl_name' : user.first_name + ' ' + user.last_name,
        'class_display' : class_display,
        }
        return render(request, 'Lecturer/lecturerdashboard.html', user_dict)
    else:
        return HttpResponse('Unexpected error')

lecturerdashboard.html 扩展了 base.html

我为我的 views.py 添加了更少的代码,因为我认为我没有犯任何错误。我想跟大家确认的是,我在lecturerdashboard.html中传入的user_dict也可以在base.html中使用,但是我很迷惑地发现,如果一个键和值在任何一个中使用一个,另一个不能使用它。 例如,我能够在 lecturerdashboard.html 的内容部分中显示单位,但是当我在 base.html 中使用 class_display 时,讲师单击单位时将单位显示为下拉菜单选择,内容部分将无法工作,因为它不理解 class_display。 抱歉,如果问题令人困惑 总之,parent 和 child 理解视图传递的参数,但是如果在 parent 中使用键值,child 不理解它 我只是想确认一下,这是真的吗? 谢谢

不知道我理解清楚没有: 您想访问每个模板中的某些变量,例如 class_display 吗? 如果是这样,最好的解决方案是使用上下文处理器。示例:

  1. 例如在您的应用中创建文件context_processors.py
from users.models import UserMessage


def notifications(request):
    if not request.user.is_anonymous:
        notifications = UserMessage.objects.filter(
            receiver=request.user, read=False)

        ctx = {
            "notifications": notifications,
            "notifications_number": notifications.count()
        }
        return ctx
    return {}
  1. 在settings.py中 模板 --> 'context_processors' 添加:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "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',
                'app_name.context_processors.notifications' # added this!
            ],
        },
    },
]

这与模板没有任何关系。 zip 是一个迭代器。一旦你遍历它,它就用完了,不能再用了。如果你想多次迭代它,调用list就可以了:

 class_display = list(zip(unit_list, period_display))