如何使用自己的模型 Django 注册用户

How to register user using your own Model 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中只需检查角色并在pet owner模型

中创建宠物owner object

你也可以在没有滚动的情况下做到这一点,只需编写逻辑,如果用户创建,那么当用户被添加时,它应该自动创建一个 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("/")