回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我们将Django 2.1用于<a href="https://github.com/speedy-net/speedy-net" rel="nofollow noreferrer">Speedy Net</a>。我为用户添加了一个管理视图-每个用户的URL都是用户的相同URL,但前缀是<code>"/admin/user"</code>。我使用上下文处理器定义了管理员用户前缀:</p>
<pre><code>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,
}
</code></pre>
<p>但问题是,基本模板和包含的模板看不到这个变量。我在包含模板时不使用<code>only</code>关键字。但是,基本模板和包含的模板在我打印<code>{{ admin_user_prefix }}</code>时不会打印任何内容。前缀是将管理员重定向到特定于管理员的用户URL,而不是常规用户URL。但我查过了,网址是普通网址。在某些情况下,前缀是打印出来的,在我看来,如果它不是一个包含的模板,也不是一个基本模板,它就会被打印出来。问题是什么?如何解决?你知道吗</p>
<p>从<code>speedy/core/settings/base.py</code>:</p>
<pre><code>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',
],
},
},
]
</code></pre>
<p>在某些情况下,会打印前缀,因此会创建上下文。我以超级用户和职员的身份查看网站。你知道吗</p>
<p>未打印的模板<code>{{ admin_user_prefix }}</code>包含在include中,例如:</p>
<pre><code>{% include 'admin/user_list_item.html' with user=user %}
</code></pre>
<p>或者它们是呈现模板的基本模板(<code>{% extends 'profiles/user_base.html' %}</code>)。你知道吗</p>
<p>以下是视图:</p>
<pre><code>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
</code></pre>
<p><code>profiles/user_detail.html</code>包含<code>{% extends 'profiles/user_detail_base.html' %}</code>,其中包含<code>{% extends 'profiles/user_base.html' %}</code>,其中包含无法正确显示的<code>{{ admin_user_prefix }}</code>。小部件中的同一个标记显示admin用户前缀。你知道吗</p>
<p>我的模板:</p>
<p><code>speedy/net/templates/admin/profiles/user_detail.html</code>:</p>
<pre><code>{% extends 'profiles/user_detail.html' %}
{% block user_tools %}{% endblock %}
</code></pre>
<p><code>speedy/net/templates/profiles/user_detail.html</code>:</p>
<pre><code>{% extends 'profiles/user_detail_base.html' %}
{% load i18n %}
{% block title %}{{ user.name }} / {% block site_title %}{{ block.super }}{% endblock %}{% endblock %}
</code></pre>
<p><code>speedy/core/templates/profiles/user_detail_base.html</code>:</p>
<pre><code>{% 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 %}
</code></pre>
<p><code>speedy/core/templates/profiles/user_base.html</code>:</p>
<pre><code>{% 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 %}
</code></pre>
<p>我检查发现问题出在一个标签上,比如<code>{% profile_picture user '256x200' html_class="rounded-lg" %}</code>,它调用以下标签:</p>
<pre><code>@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,
}
</code></pre>
<p>未打印的前缀仅在模板<code>'accounts/profile_picture.html'</code>中。你知道吗</p>