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']
При создании нового человека мне нужно
сначала создайте объект Account (с именем =display_name, type='A') и необходимо назначить его объекту Person.
представьте форму еще раз, если учетная запись с таким именем уже существует, с ошибкой проверки.
Может ли кто-нибудь указать правильное направление, чтобы продолжить здесь?
Благодарю.
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)