P3P5
P3P5

Reputation: 1003

How to get users profile in django 1.9

I have this method in my views.py file

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)

So, I did not extend the basic User, I created my own, and i did it like this:

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)

And in settings.py a added:

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

Everything works fine, except this line:

userProfile= request.user.profile

It says that "MyUser has no attribute profile". I tried everything, get_profile(), get_profile, profile(), profile... Nothing worked. Can anyone help me? Thank you.

Upvotes: 1

Views: 443

Answers (1)

gonz
gonz

Reputation: 5276

Note that the AUTH_PROFILE_MODULE setting and the get_profile() method where remove in django 1.7.

Try adding a related_name to your MyUserProfile.user field.

Also note that you might be able to just add that slug filed on the user model and avoid the extra relation.

Upvotes: 1

Related Questions