2013-02-27 3 views
0

Я новичок в Django и искал советы по проекту среднего размера. Наш администратор в офисе - это одно, но наши пользователи также могут войти в систему и увидеть аналогичный (более ограниченный, но в основном тот же) интерфейс.Отдельный админ-сайт для пользователей

Проблема заключается в том, что адрес электронной почты пользователей - это имя пользователя, и электронные письма не обязательно должны быть уникальными (но пароли должны быть по причинам, которые вы понимаете). Гетто? Да. Но это то, чего они ожидают.

Возможно ли создать этот второй интерфейс, а также отклониться от традиционного имени пользователя для входа? Использует ли пользовательская модель Django 1.5s для меня здесь? И можно ли использовать две пользовательские модели - одну для администратора и одну для наших пользователей?

И, наконец, если я направляюсь в неправильном направлении, пожалуйста, дайте мне знать. Это продолжение вопроса, который я задал ранее, но я забыл о некоторых деталях.

РЕДАКТИРОВАТЬ: Как бы я ни ненавидел это сделать, я просто буду кодировать область участника отдельно. Появилось больше странностей с логинами, поэтому я думаю, что это будет самое простое решение, даже если оно не очень СУЩЕСТВУЕТ.

+1

Да, вы направляетесь в неправильном направлении полностью с уникальными именами пользователей, но уникальными паролями !!! – almalki

ответ

1
  1. Наличие двух интерфейсов администратора, вероятно, является глупым. Администратор Django поддерживает надежные разрешения пользователей.

  2. Храните уникальное имя пользователя и используйте аутентификацию электронной почты. Это позволяет пользователям использовать свой адрес электронной почты, если захочет. Поскольку, по крайней мере, в 1.4, адреса электронной почты не должны были быть уникальными, вы в ясности.

  3. Вот простой электронной аутентификации бэкенд:

    from django.contrib.auth.backends import ModelBackend 
    from django.contrib.admin.models import User 
    
    class EmailAuthBackEnd(ModelBackend): 
        def authenticate(self, email=None, password=None,**kwargs): 
         try: 
          user = User.objects.get(email=email) 
          if user.check_password(password): 
           return user 
          return None 
         except User.DoesNotExist: 
          return None 
    
  4. Добавьте выше в файл под названием backends.py в одном из приложений, а затем добавить к вашей settings.py:

    AUTHENTICATION_BACKENDS = AUTHENTICATION_BACKENDS + ('app.backends.EmailAuthBackEnd',) 
    
  5. В целом уникальная парольная вещь ... с этим сложно справиться. Вы можете подклассифицировать модель пользователя Django и сменить пароль на уникальную строку, или вы можете вручную установить PSQL для принудительного применения этого ограничения. ИЛИ вы могли бы лениться, предположить, что будут назначены пароли, назначить каждому пользователю случайное имя пользователя, безопасное в знании, которое вы всегда можете войти и «исправить» проблемные учетные записи.

0

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

class MyModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     self.exclude = [] 
     if request.META(REMOTE_ADDR) not in [# add list of internal ip's here] 
      self.exclude.append('field_to_hide') 
     return super(MyModelAdmin, self).get_form(request, obj, **kwargs) 

Как и в примере DOCS here. (также посмотрите список заголовков http here, чтобы получить представление о том, как вы можете сделать свой чек)

Если вы хотите изменить список объектов, доступных в главном меню администратора, посмотрите на переопределение AdminSite , чтобы добавить свой собственный метод get_urls(), который обеспечивает аналогичную функциональность для индивидуального метода get_form, который я предложил выше.

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