2016-10-06 2 views
1

Я хочу сделать приложение для курса для моего колледжа. Вот мой model.pyКак настроить параметр list_display в django с помощью набора запросов?

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 

И это это мой admin.py

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) 

Здесь я использую разрешение на уровне строк для преподавателей, так что они могут добавлять только курсы, связанные с ними и добавить курс наброски на те курсы, к которым они относятся. Вот почему я использовал инструктора в качестве внешнего ключа для курсов и написал функцию, чтобы манипулировать раскрывающимся меню внешнего ключа, чтобы в раскрывающемся меню появилось только их имя. Но когда они видят курсы, они могут наблюдать за другими курсами инструктора, и если у них есть привилегии для удаления курсов, они могут также удалить курсы других инструкторов. Поэтому я хочу, чтобы они могли видеть только те курсы в списке, который у них есть. В одном сообщении я видел функцию запроса и пытался ее реализовать, но она не решила мою проблему.

ответ

0

Ваш код в основном правильно, но этот метод на самом деле get_queryset, а не 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 GET Request URL: \t http://127.0.0.1:8000/admin/mis/course/ Джанго Версия: 1.8.3 \t Тип исключения: \t AttributeError Exception Значение: объект \t 'супер' не имеет атрибута 'queryset' Исключение Место: \t /home/sroy8091/college/mysite/mis/admin.py в get_queryset, строка 9 –

Смежные вопросы