Django: Можно ли создать такую ​​модель, как Profile Model, для автоматического создания экземпляра во время регистрации - PullRequest
1 голос
/ 06 мая 2020

У меня есть собственная модель пользователя, и я также создал из нее модель профиля. поэтому, когда пользователь регистрируется, экземпляр профиля также создается в модели профиля. Теперь у меня есть еще одна аналогичная модель - модель адреса. Я попытался настроить его таким же образом, но экземпляр адреса не создается. Возможно ли это? Это просто для понимания, можно ли создать подобную модель, например профиль. это моя модель.

class Profile(models.Model):

    user                    = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    summary                 = models.TextField(max_length=250, blank=True, null=True)
    birth_date              = models.DateField(null=True,blank=True, auto_now_add=False, auto_now=False)
    country                 = CountryField(blank_label='(select country)')
    profile_pic             = models.ImageField(upload_to='pimage/', default='pimage/default.png')

    def __str__(self):
        return f'{self.user.username} Profile'

class Address(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True)
    address = models.CharField(max_length=200, null=True)
    city = models.CharField(max_length=200, null=True)
    state = models.CharField(max_length=200, null=True)
    zipcode = models.CharField(max_length=200, null=True)
    mobile = models.CharField(max_length=12, null=True)


    def __str__(self):
        return f'{self.user.username} Address'

просмотров

@login_required
def address_add(request):
    if request.POST:
        a_form = AddressForm(request.POST, instance=request.user.address)
        if a_form.is_valid():
            a_form.save()
            messages.success(request, f'Address Saved')
            return redirect('user_address')
    else:
        a_form = AddressForm(instance=request.user.address)

    context = {'a_form':a_form,}

    return render(request, 'áccounts/user_address.html', context)

1 Ответ

1 голос
/ 06 мая 2020

Вы можете переопределить метод save () модели User для автоматического создания экземпляра Address:

from django.db import models

class User(models.Model):

    # Your user model fields

    def save(self, *args, **kwargs):
        if self._state.adding:
            # Create your Address instance here
            pass


        super(User, self).save(*args, **kwargs)

Если вы хотите знать, как вы можете расширить модель пользователя Django, вот ссылка , которая может вам помочь.


Даже если вы можете определить некоторый сигнал для создания вашего экземпляра Address после создания экземпляра User.

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Address(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)

@receiver(post_save, sender=User)
def create_user_address(sender, instance, created, **kwargs):
    if created:
        Address.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_address(sender, instance, **kwargs):
    instance.address.save()

...