2016-05-16 6 views
1

У меня есть этот метод в моем views.py файлеКак получить профиль пользователя в Джанго 1,9

def guest_login(request): 
    form = SomeForm(request.POST or None) 
    if form.is_valid(): 
     email = request.POST['email'] 
     password= request.POST['password'] 
     u = authenticate(username = email, password = password) 
     if uis not None: 
      if u.is_active: 
       login(request, u) 
       userProfile= request.user.profile 
       return HttpResponseRedirect(userProfile.get_absolute_url()) 
      else: 
       messages.error(request, 'Text', extra_tags='text') 
     else: 
      messages.error(request, 'Text', extra_tags='text') 
    else: 
     form = SomeForm() 
    context = { 
     "form": form, 
    } 

    return render(request, 'loginpage.html', context) 

Таким образом, я не распространялся основной пользователя, я создал сам, и я сделал это так:

class MyUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(_('email address'), max_length=255, db_index=True, blank = False, unique = True) 
    name= models.CharField(blank = False, max_length = 100) 
    surname= models.CharField(blank = False, max_length = 100) 
    # slug = models.SlugField(unique = True) 
    is_staff = models.BooleanField(
     _('some_text'), default=False, help_text=_(
      'text')) 
    is_active = models.BooleanField(_('ctive'), default=True, help_text=_(
     'text' 
     'text')) 
    date_joined = models.DateTimeField(_('date created'), default=timezone.now) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 

    class Meta: 
     verbose_name = _('user') 
     verbose_name_plural = _('users') 
     # abstract = True 

    def get_full_name(self): 
     return self.name + " " + self.surname 

    def get_short_name(self): 
     return self.name 

    def get_email(self): 
     return self.email 

    def email_user(self, subject, message, from_email=None, **kwargs): 
     """Send an email to this User.""" 
     send_mail(subject, message, from_email, [self.email], **kwargs) 

class MyUserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    slug = models.SlugField(unique=True) 

    def get_absolute_url(self): 
     return reverse("user:restoraunts", kwargs={"slug": self.slug}) 

User.profile = property(lambda u: MyUser.objects.get_or_create(user=u)[0]) 

def create_slug(instance, new_slug=None): 
    slug = slugify(instance.user.name) 
    if new_slug is not None: 
     slug = new_slug 
    qs = MyUserProfile.objects.filter(slug=slug).order_by('-id') 
    exists = qs.exists() 
    if exists: 
     new_slug = "%s-%s" % (slug, qs.first().id) 
     return create_slug(instance, new_slug=new_slug) 
    return slug 

def pre_save_guest_receiver(sender, instance, *args, **kwargs): 
    if not instance.slug: 
     instance.slug = create_slug(instance) 
# 
pre_save.connect(pre_save_guest_receiver, sender=MyUserProfile) 

И settings.py добавленное:

AUTH_USER_MODEL = 'korisnik.Korisnik' 
AUTH_PROFILE_MODULE = 'korisnik.KorisnikProfil' 

Все работает отлично, за исключением этой линии:

userProfile= request.user.profile 

В нем говорится, что «MyUser не имеет профиля атрибута». Я пробовал все, get_profile(), get_profile, profile(), profile ... Ничего не работало. Может кто-нибудь мне помочь? Спасибо.

ответ

1

Обратите внимание, что параметр AUTH_PROFILE_MODULE и метод get_profile() where remove in django 1.7.

Попробуйте добавить related_name на свое поле MyUserProfile.user.

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

+0

Я добавил поле пули к пользовательской модели, и все работает нормально. Я думал, возможно, добавление поля slug в пользовательский класс не было такой хорошей идеей, поэтому я попробовал его с профилем пользователя. Спасибо. – P3P5

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