How can I change display of visible value in django form?
Question:
I have Django model from external python library:
class Item(models.Model):
name = models.CharField(...)
serial = models.CharField(...)
def __str__(self):
return str(self.name)
...
I can’t change this model, but I want to display on my form widget with value as
"Item Name (Item Serial)"
My form is very simple:
# forms.py
class InventoryForm(forms.ModelForm):
class Meta:
model = Inventory
fields = ('title', 'item',)
# models.py
class Inventory(models.Model):
title = models.CharField(...)
item = models.ForeignKey(to='Item'...)
...
Can I change display of visible value?
Answers:
ModelChoiceField
, the form field used for selecting a model, supports overriding label_from_instance
(see the linked docs).
So, subclass a choice field with that…
class ItemChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return f"{obj.name} ({obj.serial})"
… and hook it up to your form:
# forms.py
class InventoryForm(forms.ModelForm):
item = ItemChoiceField(queryset=Item.objects.all())
class Meta:
model = Inventory
fields = ('title', 'item',)
I have Django model from external python library:
class Item(models.Model):
name = models.CharField(...)
serial = models.CharField(...)
def __str__(self):
return str(self.name)
...
I can’t change this model, but I want to display on my form widget with value as
"Item Name (Item Serial)"
My form is very simple:
# forms.py
class InventoryForm(forms.ModelForm):
class Meta:
model = Inventory
fields = ('title', 'item',)
# models.py
class Inventory(models.Model):
title = models.CharField(...)
item = models.ForeignKey(to='Item'...)
...
Can I change display of visible value?
ModelChoiceField
, the form field used for selecting a model, supports overriding label_from_instance
(see the linked docs).
So, subclass a choice field with that…
class ItemChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return f"{obj.name} ({obj.serial})"
… and hook it up to your form:
# forms.py
class InventoryForm(forms.ModelForm):
item = ItemChoiceField(queryset=Item.objects.all())
class Meta:
model = Inventory
fields = ('title', 'item',)