在Django Admin中创建两步对象

时间:2018-12-12 10:27:58

标签: django django-admin

我正在尝试使用JSONField更改EAV模型的实现,以存储由attribute_set定义的所有属性。 我已经想出了如何构建一个表单来编辑JSON的单个属性,但是我目前仍停留在实现新对象的创建上。我想我必须将对象创建分为两个步骤,因为我需要知道attribute_set才能生成正确的表单,但是我不知道是否有一种方法可以钩住create动作,或者通过其他任何方式来实现我的目标需要。

我的模型如下:

class EavAttribute(models.Model):
    entity_type = models.CharField(max_length=25, choices=entity_types)
    code = models.CharField(max_length=30)
    name = models.CharField(max_length=50)
    data_type = models.CharField(max_length=30, choices=data_types)

class AttributeSet(models.Model):       
    name = models.CharField(max_length=25)
    attributes = models.ManyToManyField('EavAttribute')

class EntityAbstract(models.Model):          
    attribute_set = models.ForeignKey(
        'AttributeSet',
        blank=False,
        null=False,
        unique=False,
    )

    class Meta:
        abstract = True

class Event(EntityAbstract):                    
    entity_type = models.CharField(max_length=20, null=False, choices=entity_types, default=DEFAULT_ENTITY_TYPE)        
    code = models.CharField(max_length=25, null=True, blank=True, db_index=True)    
    year = models.IntegerField(db_index=True)
    begin_date = models.DateField()       
    end_date = models.DateField()
    data = JSONField()

如何首先选择AttributeSet,然后再转到另一种表单,该表单将使用所选属性集中的属性填充?

1 个答案:

答案 0 :(得分:0)

我最终使用了get_fields()response_add()方法,就像这样:

def get_fields(self, request, obj=None):
    if obj is None:
        return ['attribute_set']
    else:
        return [attr.name for attr in obj._meta.get_fields() if not attr.auto_created and attr.name != 'id']

def get_readonly_fields(self, request, obj=None):
    readonly_fields = ['entity_type', 'code', 'state']
    if obj is not None:
        readonly_fields.append('attribute_set')
    return readonly_fields

def response_add(self, request, obj, post_url_continue=None):
    url = '/admin/risks/event/{}/change/'.format(obj.id)
    return redirect(url)

此方法的缺点是将对象保存在数据库中,然后打开以进行编辑,因此,基本上,数据库被命中两次,并且除attribute_set之外,所有属性都必须为空。 我很高兴收到更好实施的想法。