Я получаю ограничение уникальности IntegrityError UNIQUE для django - PullRequest
0 голосов
/ 03 апреля 2020

Я получаю ошибку целостности для создания клиента здесь. Когда первый клиент пытается создать учетную запись, этот код работает. Но когда приходит новый клиент и пытается создать учетную запись, ему дают УНИКАЛЬНОЕ ограничение. Где, когда Продавец пытается создать учетную запись, он создает ее, это работает для каждого нового продавца. Но эти коды, похоже, не работают для клиента.

Это была первая ошибка.

И я получил еще одну ошибку как

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)

1 Ответ

0 голосов
/ 03 апреля 2020

Проблема в приемнике сигнала, вы пытаетесь передать экземпляр Customer в поле user, которого нет у модели BillingProfile. Вместо этого передайте его в поле customer:

def user_created_receiver(sender, instance, created, *args, **kwargs):
    if created and instance.email:
        BillingProfile.objects.get_or_create(customer=instance, email=instance.email)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...