Django: особенности компоновки - PullRequest
0 голосов
/ 26 октября 2011

У меня есть следующие конструктивные соображения:

  • У меня есть 4 группы пользователей: студенты, родители, учителя и администраторы.
  • Учащиеся, родители, учителя совместно используют одну и ту же информацию об отношениях - классы, родители-дети, классы учителей и т. Д.
  • У учителей есть «портал», посредством которого они выполняют некоторые задачи, которые видны длятолько учителя, но также публикует некоторую информацию, которая распространяется среди пользователей другого типа.
  • Аналогичным образом, родители и учащиеся могут войти в систему для просмотра общей информации, но также могут иметь функции, характерные только для них самих.
  • Администраторы добавляют / редактируют новых пользователей, изменяют классы учащихся и т. Д. И могут делать объявления для всего портала.
  • Макет представления каждого "портала" должен быть похожим

В настоящее времяЯ подумал о следующих

  • Root
    • учителя
      • приложения
      • URL-адреса, и т. Д.
    • родители
      • приложения
      • URL и т. д.
    • common_apps
    • администраторы (сайт Django-admin)

teachers,parents и administrators - это отдельные проекты django.Обычные приложения содержат информацию, которой поделились все типы пользователей.teachers.apps есть приложения, которые могут работать с приложениями в common_apps.Administrator - это в основном сайт администратора.

Подходит ли эта структура для вышеуказанных требований?Будут ли проблемы с этим макетом?Пожалуйста, позвольте мне поделиться вашим опытом и дать несколько советов.

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Создайте только одно приложение и используйте модели прокси для Student, Parent и Teacher, каждая из которых наследуется от User.Создайте и используйте группы, чтобы различать их, например, учащиеся будут User s принадлежать к группе «Студент».

class StudentManager(models.Manager):
    def get_query_set(self, *args, **kwargs):
        qs = super(StudentManager, self).get_query_set(*args, **kwargs)
        return qs.filter(groups__name='Student')

class Student(User):
    objects = StudentManager()

    class Meta:
        proxy = True

Сполосните и повторите с Parent и Teacher.

Используйте сигналы для автоматической установки групп:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Student)
def set_student_group(sender, instance, created, **kwargs):
    if created:
        group, c = Group.objects.get_or_create(name='Student')
        instance.groups.add(group)

Промойте и повторите для Parent и Teacher.

Теперь создайте модель профиля пользователя:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    # Other data

In settings.py:

AUTH_PROFILE_MODULE = 'yourapp.UserProfile'

Это даст вам всю необходимую инфраструктуру.Вы можете продолжить расширение моделей Student, Parent и Teacher дополнительными функциями.Вы просто не можете добавлять новые поля к ним;все дополнительные поля должны быть заполнены UserProfile.

Администраторы и только администраторы должны иметь доступ к администратору Django (User.is_staff=True).Оттуда они могут сделать все необходимое управление.Вы должны разработать систему внешнего интерфейса, чтобы обслуживать учеников, учителей и родителей.

0 голосов
/ 26 октября 2011

Я думаю, что структура вашего приложения немного сбивает с толку. С моей точки зрения, вы можете использовать что-то похожее на:

  • Только один проект Django. Если это будет уникальный портал, вы должны объединить все в один проект django.
  • Создайте все свои приложения внутри этого проекта: предметы, расписания ... все, что вам нужно.
  • Расширение пользовательской модели для родителей, учеников, учителей. Вы можете использовать группы и разрешения для обработки информации о каждой из них.

Эта структура также позволяет вам иметь одинаковый «макет» для всех разделов.

Проверьте документацию django для пользовательских моделей и профилей, это поможет вам.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...