1

我的代码:

{% if request.user.is_staff %}
  {% extends "base.html" %}
    {% load crispy_forms_tags %}
    {% block content %}
      <div class="content-section">
          <form method="POST">
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="border-bottom mb-4">
                      Create A Post
                  </legend>
                  {{ form|crispy }}
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-outline-info" type="submit">
                      Post
                  </button>
              </div>
          </form>
      </div>
    {% endblock content %}
{% else %}
  <head>
    <meta http-equiv="refresh" content="5; url=/" />
  </head>
  <body>
    <h1>Restricted Access To Staff!</h1>
    <p>You will be redirected to the home page in 5 seconds</p>
  </body>
{% endif %}

错误: 在此处输入图像描述

我不知道为什么它不起作用,这可能与 {% if request.user.is_staff %} 位有关吗?

4

1 回答 1

1

正如关于模板继承的文档所说

如果{% extends %}在模板中使用,它必须是该模板中的第一个模板标签。否则,模板继承将不起作用。

因此,您无法使用{% if … %} … {% else %} … {% endif %}模板标签 [Django-doc]来确定是否继承。

您可以将此逻辑移动到视图中,因此:

def some_view(request):
    # …
    if request.user.is_staff:
        return render(request, 'my_template.html', context)
    else:
        return render(request, 'my_other_template.html', context)

开发一个装饰器可能会更好,它会自动检查用户是否是员工,并正确呈现内容,例如:

from functools import wraps

def requires_staff_redirect(f):
    @wraps(f)
    def g(request, *args, **kwargs):
        if not request.user.is_staff:
            return render(request, 'my_other_template.html')
        else:
            return f(*args, **kwargs)
    return g

然后我们可以像这样装饰一个视图:

@requires_staff_redirect
def my_view(request):
    # …

然后它只会在用户是员工时触发视图,否则它将呈现my_other_template.html页面。

于 2020-12-24T14:04:50.343 回答