#django #django-views #django-templates #django-admin
#django #django-просмотры #django-шаблоны #django-администратор
Вопрос:
Я хочу создать пользовательский вид администратора. В нем должны быть перечислены конкретные объекты из модели и добавлены атрибуты к ней.
Точнее, у меня есть таблицы Student и Lecture. Лекция имеет атрибут enrolled_students, который представляет собой отношение «Многие ко многим» (студент может быть зачислен на несколько лекций; на лекции может быть много зарегистрированных студентов). Студенты могут получать баллы за лекцию, что определяет их оценку.
Поэтому я хотел бы предоставить представление администратора, в котором перечислены все учащиеся конкретной лекции, а также их достигнутые баллы и оценки. Оценка вычисляется лениво, так как баллы часто меняются.
Как я могу это реализовать? Возможно ли это с помощью встроенных методов?
Большое спасибо!
РЕДАКТИРОВАТЬ 1 Я добавил исходный код (упрощенный):
Лекция:
class Lecture(UUIDModel, TimeFramedModel):
participants = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name="enrolled_lectures",
)
title = models.CharField(
max_length=100,
unique=True,
)
grading_scale = models.ForeignKey(
GradingScale, on_delete=models.SET_NULL, blank=True, null=True
)
def get_score(self, user):
""" Returns score of a particular user. """
score = (
user.submission_set
.filter(exercise__lesson__lecture=self, score__isnull=False, exercise__rated=True)
.values("exercise")
.annotate(max_exercise_score=models.Max("score"))
.aggregate(total_score=models.Sum("max_exercise_score"))["total_score"]
)
return score if score else 0
Студент (модель пользователя):
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_("email address"), unique=True)
full_name = models.CharField(_("full name"), max_length=130)
)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["full_name"]
objects = UserManager()
GradingScale содержит метод get_grade(оценка). Вы можете найти весь исходный код здесь.
Комментарии:
1. Можете ли вы поделиться моделями
Student
иLecture
?2. @AjayLingayat Я добавил исходный код.