Как зарегистрировать пользователя с помощью собственной модели Django

У меня проблемы с регистрацией пользователя как PetOwner. Я не уверен, что я должен написать в моем представлении signup. Я могу зарегистрировать пользователя, и этот пользователь не имеет статуса администратора или сотрудника, что замечательно, потому что у него не должно быть этих привилегий. Проблема в том, что я хочу, чтобы они были не просто пользователями, а чтобы они были PetOwner. В настоящее время они только User, но не PetOwner. Что я делаю неправильно или что мне нужно добавить?

в models.py

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User


class PetOwner(models.Model):
    """Model representing a pet owner."""

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=50, help_text="Enter owner's first name")
    last_name = models.CharField(max_length=50, help_text="Enter owner's last name")
    email = models.EmailField(
        max_length=50, blank=True, unique=True, help_text="Enter owner's email"
    )
    phone_number = models.CharField(
        max_length=15, blank=True, unique=True, help_text="Enter owner's phone number"
    )
    address = models.ForeignKey(
        "Address", on_delete=models.SET_NULL, null=True, blank=True
    )

    class Meta:
        """Controls default ordering of records when querying the Model type."""

        ordering = ["first_name", "last_name"]

    def __str__(self):
        """String for representing the Model object."""
        return self.first_name

    def get_absolute_url(self):
        """Returns the url to access a detail record of this pet owner."""
        return reverse("petowner_detail", args=[str(self.id)])

в файле views.py

from django.shortcuts import render, redirect
from django.views import generic
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import PetOwner, Pet, Breed, Address


def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.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)
            login(request, user)
            return redirect("/")
        else:
            return render(request, "signup.html", {"form": form})
    else:
        form = UserCreationForm()
        return render(request, "signup.html", {"form": form})

в urls.py

path("signup/", views.signup, name="signup"),

в signup.html

{% extends 'base.html' %}

<h1>Sign Up Page</h1>

{% block content %}
<form method="post">
  {% csrf_token %} {{ form.as_p }}
  <button type="submit">Register</button>
</form>
{% endblock content %}

вы должны использовать Foreign key вместо поля один к одному для владельца питомца и дать ему ролл как владелец питомца пример ниже

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User

roll={petowner, roll1, roll2}

user = models.OneToOneField(User, on_delete=models.CASCADE, add roll here)

в views.py просто проверяем ролл и создаем питомца owner object в pet owner модели

также вы можете сделать это без рулона просто напишите логику для если пользователь создан то когда пользователь будет добавлен он должен создать pet owner object автоматически

например

if user:
     classrooms = Classroom.objects.filter(id=id, is_active=True)
if users.exists():
   user = users.first()
   is_user = (user.user==request.user)
   if not pet_owner:
      pet_owner.objects.create(user=user, user=request.user).save()

это просто пример имена и модель могут быть изменены

Вам необходимо сохранить связанные PetOwner после пользователя.

if form.is_valid():
    user = form.save()
    # Create the related data here...
    petOwner = PetOwner(
        user=user,
        first_name=user.first_name,
        last_name=user.last_name
    )
    petOwner.save()
    login(request, user)
    return redirect("/")

Вернуться на верх