【问题标题】:django createviw- create another model object and use it in current modeldjango create view - 创建另一个模型对象并在当前模型中使用它
【发布时间】:2018-03-03 13:22:05
【问题描述】:

我有两个模型,如下所示。

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时,我需要

  1. 首先创建一个 Account 对象(name=display_name, type='A')并需要将其分配给 Person 对象。

  2. 如果已存在具有相同 display_name 的帐户,则再次呈现表单,但出现验证错误。

有人可以指出正确的方向吗?

谢谢。

【问题讨论】:

  • 从读取 Django 信号或从处理注册表单的视图开始也很实用
  • pre_save 信号能否将已创建对象的引用返回给 Sender?

标签: django activity-oncreateview


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2016-06-19
    • 2017-11-11
    相关资源
    最近更新 更多