Joey Dumont
Joey Dumont

Reputation: 938

Using the Django admin site for specific instances of a model

I am working on my first Django app, and was thinking of using a rather abstract database schema, like this:

class ListCategories(models.Model):
  name = models.TextField(max_length=200)
  type = models.TextField(max_length=200)

class ListItems(models.Model):
  category = models.ForeignKey('ListCategories', on_delete=models.CASCADE)
  item = models.TextField(max_length=200)
  sorstorder = models.IntegerField()

class ObjectType(models.Model):
  name = models.TextField(max_length=200)

class Object(models.Model):
  type = models.ForeignKey('ObjectType', on_delete=models.CASCADE)
  name = models.TextField(max_length=200)

class ObjectTypeProperties(models.Model):
  name = models.TextField(max_length=200)
  object_type = models.ForeignKey('ObjectType', on_delete=models.CASCADE)
  list_category = models.ForeignKey('ListCategories', null=True, on_delete=models.CASCADE)

class ObjectProperties(models.Model):
  object = models.ForeignKey('Object', on_delete=models.CASCADE)
  property = models.ForeignKey('ObjectTypeProperties', on_delete=models.CASCADE)
  list_item = models.ForeignKey('ListItems', on_delete=models.CASCADE)
  result = models.TextField(max_length=200)

class HistoricalNumericalData(models.Model):
  object = models.ForeignKey('Object', on_delete=models.CASCADE)
  object_property = models.ForeignKey('ObjectProperties', on_delete=models.CASCADE)
  value = models.FloatField()

class Image(models.Model):
  object = models.OneToOneField('Object',on_delete=models.CASCADE)
  image = models.ImageField()

  def image_tag(self):
    return mark_safe('<img src="{}"/>'.format(self.image.url))

  image_tag.short_description = 'Image'

This is very flexible on the DB, as you can add object types and object properties by simply adding lines to the DB. However, I would like to use the admin interface to add new Objects to the database, and this is where this schema is tricky to use. The form would need to be different for each object type, however, as they would have not the same properties.

Is there a way to register models to use with the admin site that behave differently according to a field in a model? In my case, the Object.type field would dictate the nature of the form.

Would it be better to just define more concrete models?

Upvotes: 1

Views: 205

Answers (1)

Gabriel
Gabriel

Reputation: 1149

You can try to use ModelAdmin.get_fieldsets() method, as you receive an object instance you can modify which fieldsets you want to publish, check the docs -> https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_fieldsets

Otherwise, U can explore to use ModelAdmin.get_form(), build custom forms for each Object.type and instantiate de proper one for each case, docs here -> https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form

Hope this puts you on the right way.

G.

Upvotes: 1

Related Questions