Я использую django.contrib.auth и у меня есть работающая система входа в систему / регистрации, однако я хочу расширить мою модель пользователя, чтобы у нее был только уличный адрес и номер телефона для регистрации, и я не уверен, как можноЯ делаю это правильно.То, что я сделал, работает, но чувствует себя неправильно, и я хотел бы знать правильный способ сделать это.
Я создал accounts
приложение и в models.py
У меня есть это:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
address = models.CharField(max_length=200)
address_number = models.CharField(max_length=20)
phone = models.CharField(max_length=20)
... тогда я зарегистрировал это в admin.py
:
from django.contrib import admin
from .models import User
admin.site.register(User)
... затем в settings.py
я добавил эту строку:
AUTH_USER_MODEL = 'accounts.User'
... и везде, где яиспользовал django.contrib.auth.User
, теперь я использую accounts.models.User
.
Как я уже сказал, это работает, однако это почему-то кажется неправильным, и это легко может быть, поскольку я впервые расширяю модель User.Почему я думаю, что это неправильно?С одной стороны, Users
исчез в админке из «Аутентификации и авторизации» и вместо этого находится в «Аккаунтах» (как и ожидалось).
Как я могу сделать это надлежащим образом?
@EDIT:
Вот моя регистрационная форма:
from django import forms
from accounts.models import User
class RegistrationForm(forms.ModelForm):
email = forms.EmailField(max_length=200, help_text='Required')
password = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)
class Meta:
model = User
fields = (
'username',
'email',
'first_name',
'last_name',
'address',
'address_number',
'phone'
)
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Passwords do not match.')
return cd['password2']
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
raise forms.ValidationError(
'Please use another e-mail, that is already taken.')
return email