Miguel Rodrigues
Miguel Rodrigues

Reputation: 321

Extends Django User Model with my Model User

Already seen some documents and read some posts about this matter but I cant seem to undersatand maybe someone could help me out. I want to extend Django user model with my model "User".

This is my model user:

from django.db import models
from django.contrib.auth.models import User as UserDJANGO
from django.db.models.signals import post_save
from django.dispatch import receiver

class User(models.Model):
    user_django = models.OneToOneField(UserDJANGO, on_delete=models.CASCADE)
    user_animals = models.ManyToManyField(Animal, blank=True)

    def __str__(self):
        return self.user_django.email

my signup view:

def signup(request):
    auth_logout(request)
    form = UserCreationForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=password)
            auth_login(request, user)
            return redirect("home")
    return render(request, 'signup.html', {'form': form})

and my form in the template:

<form method="post" class="form-signin">
    {% csrf_token %}
    <img class="mb-4" src="{% static 'images/logo_transparent.png' %}" alt="" width="300" height="300">
    <h1 class="h3 mb-3 font-weight-normal text-white">Registar-se</h1>

    <label for="id_username" class="sr-only">Endereço de Email</label>
    <input type="email" name="username" maxlength="150" autocapitalize="none" autocomplete="username"
           autofocus="" required="" id="id_username" class="form-control" placeholder="Endereço de Email">

    <label for="id_password1" class="sr-only">Password</label>
    <input type="password" name="password1" autocomplete="new-password" required="" id="id_password1"
           class="form-control" placeholder="Password">

    <label for="id_password2" class="sr-only">Password</label>
    <input type="password" name="password2" autocomplete="new-password" required="" id="id_password2"
           class="form-control" placeholder="Confirme a Password">

    <p class="mb-3 font-weight-normal text-white">Já possui conta? <a class="text-white" href="/login">Inicie sessão</a>
    </p>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Registar</button>
    <!--<p class="mt-5 mb-3 text-white">&copy; 2017-2019</p>-->
</form>

How can I when I create a user link the two?(Read thats something about the signals but did not understand)

Upvotes: 1

Views: 41

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477804

You do not need signals, you can simply create one in your view:

from app.models import User as MyUser

def signup(request):
    auth_logout(request)
    form = UserCreationForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            user = form.save()
            MyUser.objects.create(user_django=user)
            auth_login(request, user)
            return redirect("home")
    return render(request, 'signup.html', {'form': form})

I would however advise not to name your model User, but for example Profile since two classes with the same name can create a lot of confusion.

Upvotes: 1

Related Questions