2016-10-24 7 views
0

私はdjangoアプリケーションでクラスベースのビューとmixinsを使用しています。また、このグループに所属するユーザーだけに、コースオブジェクトを編集、追加、削除する権限を与えるためのInstructorsという名前のグループを作成しました。 ManageCourseListビュー現在のユーザーが作成したコースをレンダリングするための責任があるで は、私が追加「group_list」ユーザーが属するグループを含む引数を渡すためにget_context_dataメソッドをオーバーライドしてみましたに。 テンプレートManageCourseListビューレンダリングでアクセスしようとしました。 問題は、現在のユーザーがInstructorsグループに属していても、それでもelse条件データをレンダリングすることです。 助けてください、私のファイル:それはあるようコンテキスト内のユーザのグループ名を渡し、djangoのテンプレートでアクセスする

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 %} 

答えて

1

は、その方法は無意味です。テンプレート内のuser.groupsに簡単にアクセスできます。

第2に、グループ内の各項目は文字列ではなくグループオブジェクトです。あなたの状態は決して成功しません。 group.nameと比較する必要があります。また、インストラクターが最初のグループになることは確かです。テンプレートで今

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 

をして::

これを解決するために、私はむしろ、グループリストよりインストラクターフラグを追加するためにあなたのget_context_dataを書き換えるだろう、それが働いた

{% if user_is_instructor %} 
+0

感謝を。 –

+0

私はプロジェクトの場所のほとんどでこのグループチェックを使用する必要があります。私はそれを一度やってからどこでも使うことができます。そうでなければcontext_processorのようなものです。そうでなければ、このチェックを行うすべてのビューでこのチェックのための追加クエリを与えます。 –

関連する問題