$ wine/models.py:
class Color(models.Model):
class Meta: abtract = true
tone = models.CharField(max_length = 32, choices = SOMETHING)
class RedColor(Color): R_COLORS = (
("Light red", "light red"),
("Dark red", "dark red") )
# Tells the parents class that SOMETHING = R_COLORS for red wines
class WhiteColor(Color): W_COLORS = ( ("Ligth white", "ligth white"), ("Dark white", "dark white") ) # Tells the parents class that SOMETHING = W_COLORS for white
class Color(models.Model):
red_or_white = models.CharField(max_length=10, choices=[('red', 'Red'), ('white', 'White')])
tone = models.CharField(max_length=32)
class Wine(models.Model):
name = models.CharField(max_length=255)
color = models.ForeignKey(Color)
class ColorBase(models.Model):
class Meta: abstract = true
COLORS_CHOICHES = (
("Red", "Red"),
("Blue", "Blue"),
) tone= models.CharField(max_length = 32, choices = COLORS_CHOICHES)
class RedColor(ColorBase): COLORS_CHOICHES = ( ("Light red", "light red"), ("Dark red", "dark red") ) ....
class WhiteColor(ColorBase): COLORS_CHOICHES = ( ("Light white", "light white"), ("Dark white", "dark white") ) ....
class ColorBaseAdmin(admin.ModelAdmin):
model = ColorBase
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'status':
kwargs.update(
{'choices':self.model. COLORS_CHOICHES}
)
#I THINK THIS IS NOT REQUIRED BECAUSE AUTOMATICALLY YOU HAVE MODEL UPDATED.. you can omit these two lines
if settings.DEBUG self.model == ColorBase:
logger.warning("Please set the model in your model admin to display correct status' choices")
return super(ColorBaseAdmin, self).formfield_for_dbfield(
db_field, **kwargs)
class RedColorAdmin(ColorBaseAdmin):
model=RedColor
class WhiteColorAdmin(ColorBaseAdmin):
model=WhiteColor
admin.site.register(RedColor, RedColorAdmin)
admin.site.register(WhiteColor, WhiteColorAdmin)
#HOPE THIS WORKS BUT I DIDN'T TEST IT
class BaseColorForm(forms.ModelForm):
def __init__(self, **kwargs):
self.base_fields['tone'].choices=self.Meta.model.COLOR_CHOICES super(BaseColorForm, self).__init__(*args, **kwargs)
class RedColorForm(BaseColorForm):
class Meta:
model = RedColor
class WhiteColorForm(BaseColorForm):
class Meta:
model = WhiteColor