Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板不';无法获取上下文变量_Python_Django - Fatal编程技术网

Python Django模板不';无法获取上下文变量

Python Django模板不';无法获取上下文变量,python,django,Python,Django,我们将Django 2.1用于。我为用户添加了一个管理员视图-每个用户的URL都是用户的相同URL,但前缀为“/admin/user”。我使用上下文处理器定义了管理员用户前缀: def add_admin_user_prefix(request): if ((request.user.is_superuser) or (request.user.is_staff)): admin_user_prefix = "/admin/user" else:

我们将Django 2.1用于。我为用户添加了一个管理员视图-每个用户的URL都是用户的相同URL,但前缀为
“/admin/user”
。我使用上下文处理器定义了管理员用户前缀:

def add_admin_user_prefix(request):
    if ((request.user.is_superuser) or (request.user.is_staff)):
        admin_user_prefix = "/admin/user"
    else:
        admin_user_prefix = ""
    return {
        'admin_user_prefix': admin_user_prefix,
    }
但问题是,基本模板和包含的模板看不到此变量。在包含模板时,我不会仅使用
关键字。但是,当我打印
{{{admin\u user\u prefix}}
时,基本模板和包含的模板不会打印任何内容。前缀用于将管理员重定向到特定于管理员的用户URL,而不是常规用户URL。但是我检查过了,URL是常规URL。在某些情况下,前缀是打印出来的,在我看来,如果它不是包含的模板,也不是基础模板,那么它就是打印出来的。问题是什么?如何解决

speedy/core/settings/base.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            str(APP_DIR / 'templates'),
            str(ROOT_DIR / 'speedy/core/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',
                'django.template.context_processors.i18n',

                'speedy.core.base.context_processors.active_url_name',
                'speedy.core.base.context_processors.settings',
                'speedy.core.base.context_processors.sites',
                'speedy.core.base.context_processors.speedy_net_domain',
                'speedy.core.base.context_processors.speedy_match_domain',
                'speedy.core.base.context_processors.add_admin_user_prefix',
            ],
        },
    },
]
在某些情况下,会打印前缀,因此会创建上下文。我以超级用户和职员的身份查看网站

未打印
{{admin\u user\u prefix}}
的模板包括在包含中,例如:

{% include 'admin/user_list_item.html' with user=user %}
或者它们是呈现模板的基础模板(
{%extends'profiles/user_base.html%}

这是一种观点:

class UserDetailView(UserMixin, generic.TemplateView):
    template_name = 'profiles/user_detail.html'

    def get_widget_kwargs(self):
        return {
            'request': self.request,
            'user': self.user,
            'viewer': self.request.user,
        }

    def get_widgets(self):
        widgets = []
        for widget_path in django_settings.USER_PROFILE_WIDGETS:
            widget_class = import_string(widget_path)
            widgets.append(widget_class(**self.get_widget_kwargs()))
        return widgets

    def get_context_data(self, **kwargs):
        cd = super().get_context_data(**kwargs)
        cd.update({
            'widgets': self.get_widgets(),
        })
        return cd
profiles/user\u-detail.html
包含
{%extends'profiles/user\u-detail\u-base.html%}
,其中包含
{%extends'profiles/user\u-base.html%}
,但未正确显示。小部件中的同一标记确实显示管理员用户前缀

我的模板:

speedy/net/templates/admin/profiles/user\u detail.html

{% extends 'profiles/user_detail.html' %}

{% block user_tools %}{% endblock %}
{% extends 'profiles/user_detail_base.html' %}

{% load i18n %}

{% block title %}{{ user.name }} / {% block site_title %}{{ block.super }}{% endblock %}{% endblock %}
{% extends 'profiles/user_base.html' %}

{% load i18n %}

{% block user_content_info %}
    <div class="row flex-wrap">
        {% for widget in widgets %}
            {{ widget.html }}
        {% endfor %}
    </div>
{% endblock %}
{% extends 'base_site.html' %}

{% load core_tags_and_filters %}
{% load i18n %}
{% load core_messages_tags %}
{% load rules %}

{% block content %}
    {% has_perm 'accounts.view_profile' request.user user as can_view_profile %}
    {% has_perm 'accounts.view_profile_header' request.user user as can_view_profile_header %}
    {% has_perm 'accounts.view_profile_info' request.user user as can_view_profile_info %}

    <div class="row justify-content-center">

        <div class="{% if site == speedy_match %}col-md-7{% else %}col-12{% endif %}">

            {% if can_view_profile_header %}
                <div class="row">
                    <div class="col-md">
                        <div class="page-header">
                            <h1>
                                <a href="{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">{{ user.name|truncatechars:50 }}</a>{% block user_extra %}{% endblock %}
                            </h1>
                            <div class="text-muted">
                                {% block user_status %}
                                    {% if friendship_request_sent %}
                                        {% trans 'Friendship request sent' %}
                                    {% endif %}
                                    {% if user_is_friend %}
                                        {% trans 'Your friend' context user.get_gender %}
                                    {% endif %}
                                {% endblock %}
                            </div>
                        </div>
                    </div>
                    <div class="col-md-auto">
                        <div class="my-2">
                            {% block user_tools %}
                                {% include 'profiles/tools/tools.html' %}
                            {% endblock %}
                        </div>
                    </div>
                </div>

            {% endif %}

            {% if can_view_profile %}
                {% block user_content %}
                {% endblock %}
            {% else %}
                {% if can_view_profile_info %}
                    {% include 'profiles/block_warning.html' with user=request.user other=user %}
                {% else %}
                    <div class="row">
                        <div class="col-sm-12">
                            <a href="//{{ LANGUAGE_CODE }}.{{ SPEEDY_NET_DOMAIN }}{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">
                                {# ~~~~ TODO: remove "his/her" and setup strings in Python! #}
                                {% trans "This user doesn't match your profile, " context user.get_gender %}{% trans "but you can visit his/her Speedy Net profile. " context user.get_gender %}{% trans "View " context request.user.get_gender %}{% trans "user's profile on Speedy Net." context user.get_gender %}
                            </a>
                        </div>
                    </div>
                {% endif %}
            {% endif %}
            {% block user_content_info %}
            {% endblock %}
        </div>
    </div>

{% endblock %}
speedy/net/templates/profiles/user\u detail.html

{% extends 'profiles/user_detail.html' %}

{% block user_tools %}{% endblock %}
{% extends 'profiles/user_detail_base.html' %}

{% load i18n %}

{% block title %}{{ user.name }} / {% block site_title %}{{ block.super }}{% endblock %}{% endblock %}
{% extends 'profiles/user_base.html' %}

{% load i18n %}

{% block user_content_info %}
    <div class="row flex-wrap">
        {% for widget in widgets %}
            {{ widget.html }}
        {% endfor %}
    </div>
{% endblock %}
{% extends 'base_site.html' %}

{% load core_tags_and_filters %}
{% load i18n %}
{% load core_messages_tags %}
{% load rules %}

{% block content %}
    {% has_perm 'accounts.view_profile' request.user user as can_view_profile %}
    {% has_perm 'accounts.view_profile_header' request.user user as can_view_profile_header %}
    {% has_perm 'accounts.view_profile_info' request.user user as can_view_profile_info %}

    <div class="row justify-content-center">

        <div class="{% if site == speedy_match %}col-md-7{% else %}col-12{% endif %}">

            {% if can_view_profile_header %}
                <div class="row">
                    <div class="col-md">
                        <div class="page-header">
                            <h1>
                                <a href="{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">{{ user.name|truncatechars:50 }}</a>{% block user_extra %}{% endblock %}
                            </h1>
                            <div class="text-muted">
                                {% block user_status %}
                                    {% if friendship_request_sent %}
                                        {% trans 'Friendship request sent' %}
                                    {% endif %}
                                    {% if user_is_friend %}
                                        {% trans 'Your friend' context user.get_gender %}
                                    {% endif %}
                                {% endblock %}
                            </div>
                        </div>
                    </div>
                    <div class="col-md-auto">
                        <div class="my-2">
                            {% block user_tools %}
                                {% include 'profiles/tools/tools.html' %}
                            {% endblock %}
                        </div>
                    </div>
                </div>

            {% endif %}

            {% if can_view_profile %}
                {% block user_content %}
                {% endblock %}
            {% else %}
                {% if can_view_profile_info %}
                    {% include 'profiles/block_warning.html' with user=request.user other=user %}
                {% else %}
                    <div class="row">
                        <div class="col-sm-12">
                            <a href="//{{ LANGUAGE_CODE }}.{{ SPEEDY_NET_DOMAIN }}{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">
                                {# ~~~~ TODO: remove "his/her" and setup strings in Python! #}
                                {% trans "This user doesn't match your profile, " context user.get_gender %}{% trans "but you can visit his/her Speedy Net profile. " context user.get_gender %}{% trans "View " context request.user.get_gender %}{% trans "user's profile on Speedy Net." context user.get_gender %}
                            </a>
                        </div>
                    </div>
                {% endif %}
            {% endif %}
            {% block user_content_info %}
            {% endblock %}
        </div>
    </div>

{% endblock %}
speedy/core/templates/profiles/user\u detail\u base.html

{% extends 'profiles/user_detail.html' %}

{% block user_tools %}{% endblock %}
{% extends 'profiles/user_detail_base.html' %}

{% load i18n %}

{% block title %}{{ user.name }} / {% block site_title %}{{ block.super }}{% endblock %}{% endblock %}
{% extends 'profiles/user_base.html' %}

{% load i18n %}

{% block user_content_info %}
    <div class="row flex-wrap">
        {% for widget in widgets %}
            {{ widget.html }}
        {% endfor %}
    </div>
{% endblock %}
{% extends 'base_site.html' %}

{% load core_tags_and_filters %}
{% load i18n %}
{% load core_messages_tags %}
{% load rules %}

{% block content %}
    {% has_perm 'accounts.view_profile' request.user user as can_view_profile %}
    {% has_perm 'accounts.view_profile_header' request.user user as can_view_profile_header %}
    {% has_perm 'accounts.view_profile_info' request.user user as can_view_profile_info %}

    <div class="row justify-content-center">

        <div class="{% if site == speedy_match %}col-md-7{% else %}col-12{% endif %}">

            {% if can_view_profile_header %}
                <div class="row">
                    <div class="col-md">
                        <div class="page-header">
                            <h1>
                                <a href="{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">{{ user.name|truncatechars:50 }}</a>{% block user_extra %}{% endblock %}
                            </h1>
                            <div class="text-muted">
                                {% block user_status %}
                                    {% if friendship_request_sent %}
                                        {% trans 'Friendship request sent' %}
                                    {% endif %}
                                    {% if user_is_friend %}
                                        {% trans 'Your friend' context user.get_gender %}
                                    {% endif %}
                                {% endblock %}
                            </div>
                        </div>
                    </div>
                    <div class="col-md-auto">
                        <div class="my-2">
                            {% block user_tools %}
                                {% include 'profiles/tools/tools.html' %}
                            {% endblock %}
                        </div>
                    </div>
                </div>

            {% endif %}

            {% if can_view_profile %}
                {% block user_content %}
                {% endblock %}
            {% else %}
                {% if can_view_profile_info %}
                    {% include 'profiles/block_warning.html' with user=request.user other=user %}
                {% else %}
                    <div class="row">
                        <div class="col-sm-12">
                            <a href="//{{ LANGUAGE_CODE }}.{{ SPEEDY_NET_DOMAIN }}{{ admin_user_prefix }}{% url 'profiles:user' slug=user.slug %}">
                                {# ~~~~ TODO: remove "his/her" and setup strings in Python! #}
                                {% trans "This user doesn't match your profile, " context user.get_gender %}{% trans "but you can visit his/her Speedy Net profile. " context user.get_gender %}{% trans "View " context request.user.get_gender %}{% trans "user's profile on Speedy Net." context user.get_gender %}
                            </a>
                        </div>
                    </div>
                {% endif %}
            {% endif %}
            {% block user_content_info %}
            {% endblock %}
        </div>
    </div>

{% endblock %}
我检查并发现问题出在一个标记上,例如
{%profile\u picture user'256x200'html\u class=“rounded lg”%}
,它调用以下标记:

@register.inclusion_tag('accounts/profile_picture.html')
def profile_picture(user, geometry, with_link=True, html_class=''):
    return {
        'user': user,
        'geometry': geometry,
        'width': geometry.split('x')[0],
        'with_link': with_link,
        'html_class': html_class,
    }

前缀未打印仅在模板
'accounts/profile\u picture.html'

中。您是否在settings.py中添加了上下文处理器

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',
            'Your context processor' 
            ]
       }
   }
]  

如果要使用在包含的模板中创建的上下文处理器变量,请在包含之前添加:

{%add_admin_user_前缀为add_admin_user_前缀%}
{%include“whatever.html”%}

我不知道为什么一定要这样做,但对于我使用的一个包(
django postman
)来说,它对我来说是有效的。希望您的上下文变量可以全局访问。

正如我在评论中提到的,这是由于使用
inclusion\u标记来呈现模板

问题是它们没有任何上下文变量,因此,不会调用自定义的
上下文处理器

您应该在模板标记中使用
takes\u context=True
,以使其接受上下文数据

现在有效的代码是:

@register.inclusion_tag(filename='accounts/profile_picture.html', takes_context=True)
def profile_picture(context, user, geometry, with_link=True, html_class=''):
    context = copy.copy(context)
    context.update({
        'user': user,
        'geometry': geometry,
        'width': geometry.split('x')[0],
        'with_link': with_link,
        'html_class': html_class,
    })
    return context

是的。我已经写过,在某些情况下,前缀是打印出来的。@Uri是那些没有显示由自定义模板标记(
inclusion\u tag
)呈现的
{admin\u user\u prefix}}
的模板。我在调用模板中添加了
{admin\u user\u prefix}
,就在
{%include'admin/user\u list\u item.html'之前,user=user%}
,然后我可以看到打印的管理员前缀。但是将其更改为
{%include'admin/user\u list\u item.html',user=user admin\u user\u prefix=admin\u user\u prefix%}
不起作用。@PedramParsian实际上你是对的。很抱歉,我没有意识到这个错误,但问题在于使用
包含标记呈现的模板出现了问题。这引发了一个异常:
模板语法错误位于/admin/users/第15行的无效块标记:“add_admin\u user\u prefix”,应为“empty”或“endfor”。您忘记注册或加载此标签了吗?
是的,很抱歉,实际上包裹
邮递员
通过templatetag定义了此变量,我忘记了。谢谢,它可以工作!您介意我编辑您的答案并添加现在可以使用的代码吗?如果您这样做,我将不胜感激:)