在上下文中传递用户的组名并在 django 的模板中访问
Passing group name of a user in context and accessing in template in django
我在我的 Django 应用程序中使用了基于 class 的视图的混合。我还创建了一个名为 Instructors 的组,只允许属于该组的用户拥有某些权限,即编辑、添加和删除课程对象。
在负责呈现当前用户创建的课程的 ManageCourseList View 中,我试图覆盖 get_context_data 方法传递额外的 'group_list' 参数,其中包含用户所属的组。
我试图在模板 ManageCourseList 视图呈现中访问它。
问题是虽然当前用户属于 Instructors 组,但它仍然呈现 else 条件数据。
请帮助,我的文件:
Views.py
from django.shortcuts import render
from django.core.urlresolvers import reverse_lazy
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView,UpdateView,DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin,PermissionRequiredMixin
from .models import Course
class OwnerMixin(object):
def get_queryset(self):
qs = super(OwnerMixin,self).get_queryset()
return qs.filter(owner=self.request.user)
class OwnerEditMixin(object):
def form_valid(self,form):
form.instance.owner = self.request.user
return super(OwnerEditMixin, self).form_valid(form)
class OwnerCourseMixin(OwnerMixin,LoginRequiredMixin):
model = Course
fields = ['subject','title','slug','overview'] # why use this attribute?
success_url = reverse_lazy('courses:manage_course_list') # use of it?
class OwnerCourseEditMixin(OwnerCourseMixin,OwnerEditMixin):
fields = ['subject','title','slug','overview']
success_url = reverse_lazy('courses:manage_course_list')
template_name = 'courses/manage/course/form.html'
class ManageCourseListView(OwnerCourseMixin,ListView):
template_name = 'courses/manage/course/list.html'
def get_context_data(self, **kwargs):
context = super(ManageCourseListView,self).get_context_data(**kwargs)
context['group_list'] = self.request.user.groups.all()
return context
list.html
{% extends "base.html" %}
{% block title %}My courses{% endblock %}
{% block content %}
{% if group_list.0 == "Instructors" %}
<h1>My courses</h1>
<div class="module">
{% for course in object_list %}
<div class="course-info">
<h3>{{ course.title }}</h3>
<p>
<a href="{% url 'courses:course_edit' course.id %}">Edit</a>
<a href="{% url 'courses:course_delete' course.id %}">Delete</a>
</p>
</div>
{% empty %}
<p>You haven't created any courses yet.</p>
{% endfor %}
<p>
<a href="{% url 'courses:course_create' %}" class="button">Create new course</a>
</p>
</div>
{% else %}
<h1>No courses to display</h1>
{% endif %}
{% endblock %}
首先,这种方法毫无意义;您可以简单地在模板中访问 user.groups
。
其次,组中的每一项都是一个组对象,而不是一个字符串。所以你的条件永远不会成功;您需要与 group.name
进行比较。另外,也很难确定讲师会是第一批。
为了解决这个问题,我会重写你的 get_context_data 以添加一个教师标志而不是小组列表:
def get_context_data(self, **kwargs):
context = super(ManageCourseListView,self).get_context_data(**kwargs)
context['user_is_instructor'] = self.request.user.groups.filter(name='Instructors').exists()
return context
现在在模板中:
{% if user_is_instructor %}
我在我的 Django 应用程序中使用了基于 class 的视图的混合。我还创建了一个名为 Instructors 的组,只允许属于该组的用户拥有某些权限,即编辑、添加和删除课程对象。 在负责呈现当前用户创建的课程的 ManageCourseList View 中,我试图覆盖 get_context_data 方法传递额外的 'group_list' 参数,其中包含用户所属的组。 我试图在模板 ManageCourseList 视图呈现中访问它。 问题是虽然当前用户属于 Instructors 组,但它仍然呈现 else 条件数据。 请帮助,我的文件:
Views.py
from django.shortcuts import render
from django.core.urlresolvers import reverse_lazy
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView,UpdateView,DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin,PermissionRequiredMixin
from .models import Course
class OwnerMixin(object):
def get_queryset(self):
qs = super(OwnerMixin,self).get_queryset()
return qs.filter(owner=self.request.user)
class OwnerEditMixin(object):
def form_valid(self,form):
form.instance.owner = self.request.user
return super(OwnerEditMixin, self).form_valid(form)
class OwnerCourseMixin(OwnerMixin,LoginRequiredMixin):
model = Course
fields = ['subject','title','slug','overview'] # why use this attribute?
success_url = reverse_lazy('courses:manage_course_list') # use of it?
class OwnerCourseEditMixin(OwnerCourseMixin,OwnerEditMixin):
fields = ['subject','title','slug','overview']
success_url = reverse_lazy('courses:manage_course_list')
template_name = 'courses/manage/course/form.html'
class ManageCourseListView(OwnerCourseMixin,ListView):
template_name = 'courses/manage/course/list.html'
def get_context_data(self, **kwargs):
context = super(ManageCourseListView,self).get_context_data(**kwargs)
context['group_list'] = self.request.user.groups.all()
return context
list.html
{% extends "base.html" %}
{% block title %}My courses{% endblock %}
{% block content %}
{% if group_list.0 == "Instructors" %}
<h1>My courses</h1>
<div class="module">
{% for course in object_list %}
<div class="course-info">
<h3>{{ course.title }}</h3>
<p>
<a href="{% url 'courses:course_edit' course.id %}">Edit</a>
<a href="{% url 'courses:course_delete' course.id %}">Delete</a>
</p>
</div>
{% empty %}
<p>You haven't created any courses yet.</p>
{% endfor %}
<p>
<a href="{% url 'courses:course_create' %}" class="button">Create new course</a>
</p>
</div>
{% else %}
<h1>No courses to display</h1>
{% endif %}
{% endblock %}
首先,这种方法毫无意义;您可以简单地在模板中访问 user.groups
。
其次,组中的每一项都是一个组对象,而不是一个字符串。所以你的条件永远不会成功;您需要与 group.name
进行比较。另外,也很难确定讲师会是第一批。
为了解决这个问题,我会重写你的 get_context_data 以添加一个教师标志而不是小组列表:
def get_context_data(self, **kwargs):
context = super(ManageCourseListView,self).get_context_data(**kwargs)
context['user_is_instructor'] = self.request.user.groups.filter(name='Instructors').exists()
return context
现在在模板中:
{% if user_is_instructor %}