Добавление / редактирование общих объектов внешнего ключа django
Модель устройства:
class Device(models.Model):
device_code = models.CharField(max_length=64,unique=True)
is_enabled = models.BooleanField(default=False)
def __unicode__(self):
return u'%s: %s' % (self.device_code, 'ENABLED' if self.is_enabled else 'DISABLED')
Значения атрибута модели:
class AttributeValue(models.Model):
attribute = models.ForeignKey(Attribute)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Meta:
abstract = True
unique_together = (
('attribute', 'content_type','object_id'),
)
index_together = (
('content_type','object_id'),
)
@property
def formatted(self):
"""
PLEASE SELECT RELATED ATTRIBUTE BEFORE USING THIS FUNCTION
"""
return self.attribute.format % self.value
def save(self,*args,**kwargs):
if hasattr(self.content_object,'invalidate_cache') and callable(self.content_object.invalidate_cache):
self.content_object.invalidate_cache()
super(AttributeValue,self).save(*args, **kwargs)
def __unicode__(self):
return u'%s %s' % (self.attribute.name, self.value)
class NumericAttributeValue(AttributeValue):
value = models.DecimalField(max_digits=12,decimal_places=4)
class LongTextAttributeValue(AttributeValue):
value = models.TextField()
class ShortTextAttributeValue(AttributeValue):
value = models.CharField(max_length=255)
class FileAttributeValue(AttributeValue):
attribute_file = models.FileField(upload_to="attribute_imgs")
Атрибут модели:
ATTRIBUTE_TYPE_CHOICES = (
('n','Numeric'),
('s','Short Text (255)'),
('m','Long Text')
)
class Attribute(models.Model):
name = models.CharField(max_length=255)
code = models.CharField(max_length=64,unique=True)
attribute_type = models.CharField(max_length=1,choices=ATTRIBUTE_TYPE_CHOICES)
sorting_order = models.PositiveIntegerField(default=0)
show = models.BooleanField(default=False)
format = models.CharField(max_length=64,default='%s')
class Meta:
ordering = ['sorting_order','name']
def __unicode__(self):
return self.name
На странице редактирования (добавления) моего устройства должна быть возможность создать или выбрать атрибут, а затем создать (или отредактировать / удалить) значение атрибута (это может быть числовое значение, длинное текстовое значение, короткое текстовое значение или файл). связан с этим атрибутом и текущим (или новым) устройством. Как бы вы создали набор форм Django для такого сценария?
1 ответ
Мне пришлось решить аналогичную проблему, и Джанго-полиморфный работал на меня.
Если вы определяете абстрактную модель как родительскую, то она позволяет вам выбирать любые дочерние модели, на которых основывается родительский интерфейс, в интерфейсе администратора Django (например, при выборе внешнего ключа).
Вам нужно будет внести некоторые изменения в вашу модель и администратора, чтобы она заработала (например, вам не понадобится GenericForeignKey
).