【问题标题】:Group permissions in HTML Template with Django使用 Django 的 HTML 模板中的组权限
【发布时间】:2017-06-11 23:19:55
【问题描述】:

我的项目遇到了一点问题。我想将我的Django website 中的一部分授权给除一个(超级管理员)之外的所有组(访客、客户……)。

这是我的 HTML 模板

        <!-- Home tab -->

        <ul class="nav navbar-nav">
            <li><a href="{% url "accueil" %}"> <span class="glyphicon glyphicon-home"></span> Accueil </a></li>

            {% if request.user|has_group:"admin" %}

            <li class = "dropdown">
                <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown">
                    Informations Mairie
                <b class = "caret"></b>
                </a>
                <ul class = "dropdown-menu">
                    <li><a href = "{% url "Mairieform" %}"> <span class="glyphicon glyphicon-pencil"></span> Créer/Editer les informations de la Mairie </a></li>
                    <li><a href = "{% url "Mairieresume" %}"> <span class="glyphicon glyphicon-home"></span> Consulter les informations de la Mairie </a></li>
                </ul>
            </li>

            <li class = "dropdown">
                <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown">
                    Actes Etat Civil
                <b class = "caret"></b>
                </a>
                <ul class = "dropdown-menu">
                    <li><a href = "{% url "home" %}"> <span class="glyphicon glyphicon-user"></span> Fiches Individuelles </a></li>
                    <li><a href = "{% url "BChome" %}"> <span class="glyphicon glyphicon-baby-formula"></span> Actes de Naissance </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-heart"></span> Actes de Mariage </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-fire"></span> Actes de Divorce </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-alert"></span> Actes de Décès </a></li>
                </ul>
            </li>
        </ul>

            {% elif request.user |has_group:"visiteur","employé", "officier", "maire" %}

        <ul class="nav navbar-nav">
            <li><a href="{% url "accueil" %}"> <span class="glyphicon glyphicon-home"></span> Accueil </a></li>
            <li class = "dropdown">
                <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown">
                    Informations Mairie
                <b class = "caret"></b>
                </a>
                <ul class = "dropdown-menu">
                    <li><a href = "{% url "Mairieresume" %}"> <span class="glyphicon glyphicon-home"></span> Consulter les informations de la Mairie </a></li>
                </ul>
            </li>

            <li class = "dropdown">
                <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown">
                    Actes Etat Civil
                <b class = "caret"></b>
                </a>
                <ul class = "dropdown-menu">
                    <li><a href = "{% url "home" %}"> <span class="glyphicon glyphicon-user"></span> Fiches Individuelles </a></li>
                    <li><a href = "{% url "BChome" %}"> <span class="glyphicon glyphicon-baby-formula"></span> Actes de Naissance </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-heart"></span> Actes de Mariage </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-fire"></span> Actes de Divorce </a></li>
                    <li><a href = "{% url "BCnotfound" %}"> <span class="glyphicon glyphicon-alert"></span> Actes de Décès </a></li>
                </ul>
            </li>
        </ul>

            {% endif %}

如您所见,我只有一个选项卡,除超级管理员组外,所有组都必须不可见。它适用于超级管理员,但我的问题是:

我如何写这行:{% if request.user|has_group:"admin" %} for :

  • 除超级管理员外的所有组
  • 或访客、客户……

类似这样的:

{% elif request.user |has_group:"visiteur","employé", "officier", "maire" %}

谢谢!

编辑:

这是来自我的一个应用程序的 views.py 文件:

#-*- coding: utf-8 -*-

import requests, os, json, glob
from django.shortcuts import render, reverse, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect, HttpResponse
from .models import BirthCertificate, Country
from .forms import BirthCertificateForm
from django.db import connection
from django.template import Context
from django.template.loader import get_template
from xhtml2pdf import pisa

import time, random

@login_required
def BirthCertificate_Home(request) :

    return render(request, 'BC_accueil.html')

@login_required
def BirthCertificate_notfound(request) :

    return render(request, 'Not_Found.html')

@login_required
def BirthCertificate_accueil(request) :

    return render(request, 'Accueil.html')

@login_required
def BirthCertificate_Form(request) :
    # Fonction permettant de créer le formulaire Acte de Naissance et le remplissage

    Bform = BirthCertificateForm(request.POST or None)
    template_name = 'BC_form.html'

    if Bform.is_valid() :   # Vérification sur la validité des données
        if '_preview2' in request.POST :
            post = Bform.save(commit=False)
            template_name = 'BC_preview.html'

        elif '_save2' in request.POST :
            post = Bform.save()
            return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))

    return render(request, template_name, {"Bform" : Bform})

@login_required
def BirthCertificate_Resume(request, id) : ...

@login_required
def BirthCertificate_PDF(request, id) : ...

【问题讨论】:

标签: html django


【解决方案1】:

最好在视图中执行此操作。

class MyView(ViewClass):
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        if self.request.user.is_superuser:
            context['show_tab'] = True
            return context
        return context

那你就可以访问这个模板了

{% if show_tab %}
  <myHtml/>
{% endif %}

我上面的回答是针对您是否使用基于类的视图。如果您使用基于函数的视图,这可能看起来更熟悉。

def my_view(request):
    context = {}
    if request.user.is_superuser<group logic>:
         context['show_tab'] = True
         return context
    return render(request, 'mytemplate.html', context)

这里的重点是您可以将字典(如上下文)传递到视图中,以使其在模板中可供您使用。

【讨论】:

  • 我必须在 admin.py 中写 MyAdminView 吗?我会试试你的例子。谢谢
  • 抱歉,我错误地访问了request。更新了我的答案。
  • 我必须在哪里写下你答案的第一部分?在 view.py 或 admin.py 中?
  • 我以为我读到这是为您网站的管理员端准备的。我很抱歉!在views.py.使用您的正常视图。您是否使用基于类的视图?或者你能提供一个你的观点的例子吗?
  • 我在我的问题中添加了一个来自我的 view.py 文件的示例;)当我在我的网站中被认证为超级管理员时,我希望看到该选项卡以及当我被认证为访客或别的东西,我不想看到这个标签;)
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 2010-12-20
  • 2011-03-18
  • 2019-11-02
  • 2015-04-21
  • 2019-09-15
  • 2012-03-17
  • 2020-10-30
相关资源
最近更新 更多