Я получаю ошибку целостности для создания клиента здесь. Когда первый клиент пытается создать учетную запись, этот код работает. Но когда приходит новый клиент и пытается создать учетную запись, ему дают УНИКАЛЬНОЕ ограничение. Где, когда Продавец пытается создать учетную запись, он создает ее, это работает для каждого нового продавца. Но эти коды, похоже, не работают для клиента.
Это была первая ошибка.
И я получил еще одну ошибку как
FieldError at / account / customer / register / Невозможно разрешить ключевое слово 'user' в поле. Доступны следующие варианты: активный, адрес, клиент, идентификатор клиента, адрес электронной почты, идентификатор, заказ, метка времени, обновление
, когда я пытаюсь сохранить электронное письмо этого клиента, оно выдает эту ошибку. Так как у меня настроена модель биллинга, и она приведена внизу. И этот не работает даже для первого клиента, который приходит и пытается создать учетную запись.
Я использовал пользовательскую модель пользователя
accounts models.py
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
"""Create and save a SuperUser with the given email and password."""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
class User(AbstractUser):
"""User model."""
username = None
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager() ## This is the new line in the User model. ##
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
email = models.EmailField(_('email address'))
full_name = models.CharField(max_length=120, null=True, blank=True)
phone = models.IntegerField(max_length=10, null=True, blank=True)
profile_pic = models.ImageField(upload_to='profile-image/', null=True, blank=True)
def __str__(self):
return self.user.email
class Seller(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
email = models.EmailField(_('email address'))
full_name = models.CharField(max_length=120, null=True, blank=True)
phone = models.IntegerField(max_length=10, null=True, blank=True)
profile_pic = models.ImageField(upload_to='profile-image/', null=True, blank=True)
def __str__(self):
return self.user.email
Это созданные мной виды
views - seller.py
def register_page(request):
form = CreateSellerForm()
if request.method == 'POST':
form = CreateSellerForm(request.POST)
if form.is_valid():
user = form.save()
group = Group.objects.get(name='seller')
user.groups.add(group)
Seller.objects.create(
user=user,
email=user.email
)
messages.success(request, 'Account created successfully!')
return redirect('accounts:seller-login')
context = {
'form': form
}
return render(request, 'accounts/seller/register.html', context)
views - customer.py
def register_page(request):
form = CreateCustomerForm()
if request.method == 'POST':
form = CreateCustomerForm(request.POST)
if form.is_valid():
user = form.save()
group = Group.objects.get(name='customer')
user.groups.add(group)
Customer.objects.create(
user=user,
# email=user.email ### FieldError Cannot resolve keyword 'user' into field.
)
messages.success(request, 'Account created successfully!')
return redirect('accounts:customer-login')
context = {
'form': form
}
return render(request, 'accounts/customer/register.html', context)
Это формы
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from accounts.models import Seller, User
class ProfileForm(forms.ModelForm):
class Meta:
model = Seller
fields = '__all__'
class CreateCustomerForm(UserCreationForm):
class Meta:
model = User
fields = ['email', 'password1', 'password2']
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email=email)
if qs.exists():
raise forms.ValidationError("email is taken")
return email
class CreateSellerForm(UserCreationForm):
class Meta:
model = User
fields = ['email', 'password1', 'password2']
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email=email)
if qs.exists():
raise forms.ValidationError("email is taken")
return email
Здесь я использовал сигнал для создания профиля биллинга.
billing models.py
class BillingProfileManager(models.Manager):
def new_or_get(self, request):
user = request.user
guest_email_id = request.session.get('guest_email_id')
created=False
obj = None
if user.is_authenticated:
obj, created = self.model.objects.get_or_create(user=user, email=user.email)
else:
pass
return obj, created
class BillingProfile(models.Model):
customer = models.OneToOneField(Customer, null=True, blank=True, on_delete=models.CASCADE)
email = models.EmailField()
active = models.BooleanField(default=True)
update = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = BillingProfileManager()
def __str__(self):
return self.email
def user_created_receiver(sender, instance, created, *args, **kwargs):
if created and instance.email:
BillingProfile.objects.get_or_create(user=instance, email=instance.email)
post_save.connect(user_created_receiver, sender=Customer)