2010-08-17 3 views
1

Я относительно новый Джанго ..Джанго аутентификации Войти

В приложении, которое я в здании, есть несколько типов пользователей (т.е. User1, user2, USER3), которые все наследуемых от django.contrib .auth.models.User и при входе в систему, каждый пользователь должен быть перенаправлен на страницу успеха в зависимости от того, какой тип пользователя он есть.

В views.py:

def login_attempt(request): 

user = request.user 
data = {} 


username = request.POST['username'] 
password = request.POST['password'] 
user = authenticate(username=username, password=password) 
if user is not None:  
    if user.is_active: 
     login(request, user) 

     try: 
      User1.objects.get(username = user.username) 
      type = "undergrad" 
     except ObjectDoesNotExist: 
      pass 

     try: 
      User2.objects.get(username = user.username) 
      type = "grad" 
     except ObjectDoesNotExist: 
      pass 

     try: 
      User3.objects.get(username = user.username) 
      type = "sponsor" 
     except ObjectDoesNotExist: 
      pass 

     return render_to_response (
       "templates/success_"+type+".html", 
       data, 
       context_instance=RequestContext(request) 
     ) 

    else: 
     return render_to_response (
       "templates/fail1.html", 
       data, 
       context_instance=RequestContext(request) 
     ) 
else: 
    return render_to_response (
      "templates/fail2.html", 
      data, 
      context_instance=RequestContext(request)) 

и type(user) является <class 'django.contrib.auth.models.User'>

Я в настоящее время работает тесты через "manage.py тест" - аутентификации и перенаправляет работают для user1 и user2 успешно, однако он не аутентифицируется для User3 и возвращает шаблон «fail2.html». Все остальные тесты с User3 вернули действительные результаты.

Любые предложения? Это мой первый вопрос, поэтому не стесняйтесь задавать вопросы, если я оставил соответствующую информацию!

Заранее спасибо.

+1

Что еще отличается между типами класса? –

+0

у каждого из них есть поле группы ForeignKeys для разных классов групп, все из которых наследуются от django.contrib.auth.Group (так же, как пользователи) – Eunice

+0

Хорошо, что отличает объекты 'Group', что заставляет их стоить полностью новые классы? –

ответ

1

Не совсем ответ на ваш вопрос, но почему бы не использовать user profile, чтобы определить ваши type и другие данные, относящиеся к классам UserX? Они просты в настройке, позволяют хранить дополнительную информацию о пользователе и позволяют продолжать использовать встроенные объекты User.

Классы профиля довольно легко (я поднял это от The Django Book, Chapter 12):

class MySiteProfile(models.Model): 
    # This is the only required field 
    user = models.ForeignKey(User, unique=True) 

    # The rest is completely up to you... 
    type = models.CharField(maxlength=100, blank=True) 

Кроме того, можно изменить по пункту в settings.py и настроить триггер автоматически создать профиль на User создания и вам хорошо идти.

Ваш результирующий код вид будет существенно упрощена, тоже:

def login_attempt(request): 
    user = request.user 
    data = {} 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None:  
     if user.is_active: 
      login(request, user) 
      type = user.get_profile().type 

      return render_to_response (
       "templates/success_"+type+".html", 
       data, 
       context_instance=RequestContext(request) 
      ) 

     else: 
      return render_to_response (
        "templates/fail1.html", 
        data, 
        context_instance=RequestContext(request) 
       ) 
    else: 
     return render_to_response (
       "templates/fail2.html", 
       data, 
       context_instance=RequestContext(request) 
      ) 
+0

Итак, у меня есть профиль пользователя, проблема заключается в том, что каждый пользовательский тип имеет определенные поля в зависимости от этого типа, и я не хотел иметь слишком много нулевых полей .. но я попробую изменение этого. Благодаря! – Eunice

+0

Если честно, если меньше 45 полей, я бы не нормализовал их.Чтобы объединить 4 разных таблицы 'UserX', 4 разных таблицы' GroupY', а таблица 'User' абсолютно не стоит. –

+0

Я понял свою проблему, но хочу поблагодарить вас за ваши усилия! к сожалению, я не могу проголосовать за ваш ответ на bc, я не имею репутации, ха-ха! но спасибо, Джек! – Eunice

0

Это не совсем ответ на вашу проблему, но вы считали, что используете группы/разрешения для разграничения между различными типами пользователей, а не для создания подклассов auth.User? Функция Django auth поставляется с достаточно полезным groups/permissions mechanism, который можно использовать, чтобы сделать вашу жизнь проще.

С помощью групп вы можете создавать группы («undergrad», «grad» и т. Д.) И предоставлять каждой группе соответствующие разрешения для достижения необходимого эффекта.

+0

Это очень верно, и я использую группы, поэтому я мог бы попытаться найти способ включить это. Спасибо – Eunice

+0

Спасибо за ваше предложение! Я понял свою проблему, но хотел поблагодарить вас за ваши усилия, предлагая разрешения! – Eunice

+0

Рад помочь :) –

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