2016-10-06 6 views
1

私は大学のためのコースガイダンスアプリを作りたいと思っています。ここに私のmodel.pyクエリーセットを使用してdjangoのlist_displayオプションをカスタマイズする方法は?

from django.db import models 
from django.contrib.auth.models import User 

# Create your models here. 

class Instructor(models.Model): 
    name = models.CharField(max_length=200) 
    owner = models.ForeignKey(User) 
    # other stuff here 
    def __str__(self): 
     return self.name 

class Course(models.Model): 
    course_code = models.CharField(max_length=10, default='CS') 
    instructor = models.ForeignKey(Instructor) 
    course_name = models.CharField(max_length=200) 
    # other stuff here 
    def __str__(self): 
     return self.course_name 

class CourseOutline(models.Model): 
    course = models.OneToOneField(Course) 
    objectives = models.TextField(blank=True) 
    # other stuff 

されており、この本、彼らは唯一のそれらに関連するコースを追加して、コースを追加できるようにここで

from django.contrib import admin 
from models import Course, CourseOutline, Instructor 

# Register your models here. 
admin.site.register(Instructor) 
class CourseAdmin(admin.ModelAdmin): 

    # some other stuff 
    def queryset(self, request): 
     qs = super(CourseAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 


     # get instructor's "owner" 
     return qs.filter(instructor__owner=request.user) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "instructor" and not request.user.is_superuser: 
      kwargs["queryset"] = Instructor.objects.filter(owner=request.user) 
      return db_field.formfield(**kwargs) 
     return super(CourseAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

    list_display = ('course_name', 'instructor') 
    list_filter = ('queryset',) 

admin.site.register(Course, CourseAdmin) 

class CourseOutlineAdmin(admin.ModelAdmin): 
    # nothing here of importance 

    # whatever was here 

    def queryset(self, request): 
     qs = super(CourseOutlineAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     # get instructor's "owner" 
     return qs.filter(course__instructor__owner=request.user) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "course" and not request.user.is_superuser: 
      kwargs["queryset"] = Course.objects.filter(instructor__owner=request.user) 
      return db_field.formfield(**kwargs) 
     return super(CourseAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

admin.site.register(CourseOutline, CourseOutlineAdmin) 

私はインストラクターのための行レベルのアクセス許可を使用しています私のadmin.py彼らが関連しているコースにのみ概要を示します。だから私はコースのための外国のキーとしてインストラクターを使用し、ドロップダウンメニューに名前だけが来るように外部キーのドロップダウンメニューを操作する関数を書いたのです。しかし、彼らはコースを見ているときに、彼らは他のインストラクターのコースを見ることができ、彼らはコースを削除する権限を持っている場合、他のインストラクターのコースを削除することができます。だから私は彼らが所有しているリストにあるコースだけを見ることができるようにしたい。 1つの投稿では、私はqueryset関数を見て、それを実装しようとしましたが、それは私の問題を解決していません。

答えて

0

あなたのコードは、主に右であるが、この方法は、実際にget_querysetいうよりquerysetあなたは、おそらくあなたは、スーパーユーザーである場合、あなたはまだ見ることができるようになることを

def get_queryset(self, request): 
    qs = super(CourseAdmin, self).get_queryset(request) 
    if request.user.is_superuser: 
     return qs 


    # get instructor's "owner" 
    return qs.filter(instructor__owner=request.user) 

注クエリセットのプロパティでそれを混ぜてきています他の人のコースでは、あまり特権のないユーザーとしてログインするようにしてください。他のクラスのメソッド名も変更する必要があります。

+0

ただし、属性のエラーが返されています。リクエストメソッド:\t リクエストURLをGET:\t http://127.0.0.1:8000/admin/mis/course/ Djangoのバージョン:1.8.3 \t 例外タイプ:\tはAttributeError 例外値:\t 'スーパー' オブジェクト'queryset'属性がありません 例外の場所:\t /home/sroy8091/college/mysite/mis/admin.py in get_queryset、9行目 –

関連する問題