Допустимый пример использования для администратора django?

Я хочу создать сайт django, где определенная группа доверенных пользователей может редактировать свою информацию о профиле. Имеет ли смысл, чтобы каждый доверенный пользователь проходил через интерфейс администратора django? Я бы хотел, чтобы они могли видеть и редактировать свою собственную информацию (очевидно). Не похоже, что это соответствует тому, как люди-джанго определяют "доверие", особенно смелый бит...

Из Книга Джанго, глава 18:

Администратор предназначен для использования люди, которые вы, разработчик, доверяете. Это не означает "люди, которые были аутентифицированы," это означает что Django предполагает, что ваш контент редакторам можно доверять, чтобы делать правильные вещь.

Это означает, что нет "одобрения", процесс редактирования контента - если вы доверяйте своим пользователям, никто не должен одобрить их изменения. Это также означает что система разрешений, в то время как мощный, не поддерживает ограничение доступ к каждому объекту. Если вы доверять кому-то, чтобы редактировать свои рассказы, вы доверяете им не редактировать любой пользователь без разрешения.

Является ли это одним из тех случаев использования, который подходит с модулем администратора django, или это просто специализированное представление для ненадежного пользователя?

Ответ 1

Нет, администратор Django не подходит для отдельных профилей пользователей, каждый пользователь сможет видеть и редактировать все остальные профили пользователей. Это больше подходит администратору, который должен управлять всеми пользователями одновременно.

Что вам нужно создать, это страница профиля пользователя. Django уже имеет приятную систему входа в систему из модуля django.contrib.auth. Вы можете легко интегрировать это в свои страницы и точно, что администратор Django использует для аутентификации пользователей.

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

Ответ 2

Я бы предложил вам создать модель Person, которая содержит OneToOneField для модели User (модель User site для пользователей сайта). Что-то вроде этого..

from django.contrib.auth.models import User

    class Person(models.Model):
        """The person class FKs to the User class and contains additional user information
        including userImage, country, etc"""

        user = models.OneToOneField(User, related_name='person_fk')
        url = models.URLField(max_length=255, blank=True)
        country = models.CharField(max_length=2, blank=True)
        state = models.CharField(max_length=50, blank=True)
        zipCode = models.IntegerField(max_length=7, blank=True, null=True)
        userImage = models.ImageField(upload_to=generate_filename, blank=True, null=True)

Ответ 3

Я бы не стал рассматривать мой личный профиль на веб-сайте как административную задачу. Я думаю, что django-profiles - это то, что вы ищете.

Ответ 4

Модель авторизации Django немного упрощена. Это просто проверка разрешения на модель в целом.

Для такого рода вещей вы в значительной степени вынуждены писать свои собственные функции просмотра, которые обрабатывают дополнительную проверку.

После того, как вы написали один или два, вы увидите шаблон. Тогда вы можете подумать о написании своего собственного декоратора, чтобы справиться с этим.

def profileView( request, object_id ):
    p= Profile.objects.get( id=int(object_id) )
    if request.session['user'] != p.get_user():
        # respond with a 401 not authorized or a helpful message
    # process normally, since the session['user'] is the user for the Profile.

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

Ответ 5

Только для справки, здесь snippet, демонстрирующий, как вы можете довольно легко достичь этого эффекта (пользователи могут редактировать свои "собственные" объектов) в администраторе Django. Предостережение: я бы не рекомендовал делать это для профилей пользователей, будет проще и гибче просто создать собственное представление вида с помощью ModelForm.

Ответ 6

Есть несколько подключаемых приложений django, которые разрешают разрешения на уровне строк для вашей модели администратора. Тем не менее, я был бы более склонным писать собственное представление, которое позволяет пользователям делать это из приложения.

У меня были схожие устремления (с использованием admin contrib) при разработке приложения, над которым я сейчас работаю, но решил, что приложение администратора действительно предназначено для использования администратором, и чтобы обычные пользователи получали собственные страницы для выполнения работы и настройка (если требуется).

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