django createviw- создать другой объект модели и использовать его в текущей модели

У меня есть две модели, как указано ниже.

class Account(models.Model):

   ASSET='A'
   LIABILITY='L'
   INCOME='I'
   EXPENSE='E'
   ACCOUNT_TYPE=((ASSET,'Asset'),
        (LIABILITY,'Liability'),
        (INCOME,'Income'),
        (EXPENSE,'Expense'))
   name=models.CharField(unique=True,db_index=True,max_length=70)
   type=models.CharField(choices=ACCOUNT_TYPE,max_length=1)

class Person(models.Model):
    first_name=models.CharField(max_length=30,)
    last_name=models.CharField(max_length=30,)
    account=models.OneToOneField(Account,on_delete=models.CASCADE)

Модель Person имеет следующий CreateView и форму модели.

class CreatePerson(CreateView):
    model=Person
    form_class=CreatePersonForm

class CreatePersonForm(forms.ModelForm):
    display_name=forms.CharField()

    class Meta:
        model= Person
        fields = ['first_name','last_name','display_name']

При создании нового человека мне нужно

  1. сначала создайте объект Account (с именем =display_name, type='A') и необходимо назначить его объекту Person.

  2. представьте форму еще раз, если учетная запись с таким именем уже существует, с ошибкой проверки.

Может ли кто-нибудь указать правильное направление, чтобы продолжить здесь?

Благодарю.

1 ответ

Решение

Вы можете реализовать clean_display_name Метод проверки, если Acount уже существует:

class CreatePersonForm(forms.ModelForm):
    display_name=forms.CharField()

    class Meta:
        model= Person
        fields = ['first_name','last_name','display_name']

    def clean_display_name(self):
        name = self.cleaned_data.get('display_name')
        account = Account.objects.filter(name=name).exists() 
        if account:
            raise forms.ValidationError('Account already exists')
        return name

Чтобы добавить аккаунт в профиль, вы можете переопределить вид form_valid метод:

class CreatePerson(CreateView):
    model=Person
    form_class=CreatePersonForm

    def form_valid(self, form):
        account = Account.objects.create(name=form.cleaned_data['display_name'])
        form.instance.account = account
        return super().form_valid(form)
Другие вопросы по тегам