django createviw-创建另一个模型对象并在当前模型中使用它
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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']
在创建新Person时,我需要
- 首先创建一个Account对象(名称= display_name,type ='A'),并将其分配给Person对象。
- 如果具有相同display_name的帐户已存在,则再次呈现该表单,并显示验证错误。
有人可以指出正确的方向继续前进吗?
谢谢。
答案
您可以实现clean_display_name
方法来检查帐户是否已存在:
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)
以上是关于django createviw-创建另一个模型对象并在当前模型中使用它的主要内容,如果未能解决你的问题,请参考以下文章
当嵌套序列化程序中有另一个模型(manytomany)时,如何在 django 模型上发布,我想同时创建两者