#python #django
#python #django
Вопрос:
Мне нужен совет по многопользовательскому типу.
Сценарий:
- Пользователь может быть организацией, где в этой организации они могут размещать рекламу на веб-сайте. Владелец этой организации (пользователь) может редактировать / удалять пользователей и объявления своей собственной организации (группы). В этом типе пользователей организации есть пользователи, которые также могут входить в систему, и они могут видеть только размещенные ими объявления, но владелец этой группы должен видеть все свои собственные объявления и объявления своих пользователей. Представьте себе список недвижимости, в котором организация имеет несколько местоположений / пользователей, которые могут размещать объявления, и должна управляться пользователем-администратором этой организации.
Какой тип или модель являются лучшими / самыми чистыми для хорошей реализации этого? Нужна ли мне модель пользователя и группы Django?
Ответ №1:
Одним из решений было бы иметь структуру «Профили пользователей».
Итак, вы используете стандартную пользовательскую модель Django и привязываете к ней несколько отношений OneToOne в зависимости от количества типов профилей, которые у вас будут. Преимущество этого заключается в том, что пользователи могут выполнять более одной роли одновременно.
Например:
from django.contrib.auth.models import User
class Organization(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="organization")
name = models.CharField(max_length=50, blank=True, null=True)
class Supervisor(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="supervisor")
name = models.CharField(max_length=50, blank=True, null=True)
organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name="supervisors")
class CustomUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="custom_user")
name = models.CharField(max_length=50, blank=True, null=True)
supervisor = models.ForeignKey(Supervisor, on_delete=models.CASCADE, related_name="custom_users", blank=True, null=True)
А затем, когда вы идете и создаете модели для показа рекламы на веб-сайте, вы можете использовать встроенный PermissionRequiredMixin.
Для этого вам нужно начать с добавления «разрешений» в мета-класс модели ad:
class Ad(models.Model):
# fields
class Meta:
permissions = [
('can_edit_ads', 'org_representative')
]
Затем, на ваш взгляд, вы должны расширить PermissionRequiredMixin, например:
class EditAd(UpdateView, PermissionRequiredMixin):
model = Ad
template_name = "ad123.html"
permission_required = "ad.can_edit_ads"
Быстрый способ протестировать ее — зайти в таблицу пользователей на панели администратора, открыть страницу сведений о пользователе, где вы можете увидеть все разрешения, и там наряду с другими вы также найдете свой собственный.
Оттуда вы можете легко назначить новое разрешение конкретному пользователю.