I've got a Model in Django, example code below (not my actual code):
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
Let's say I do the following in the Django shell:
>>> Department(name='Computer Science',abbreviation='C S ').save()
>>> Department(name='Mathematics',abbreviation='MATH').save()
>>> Department(name='Anthropology',abbreviation='ANTH').save()
I now have those four departments stored in my database. Say we have another class, Course
, which belongs to a Department
:
class Course(models.Model):
department = models.ForeignKey('Department')
number = models.IntegerField()
class CourseForm(ModelForm):
class Meta:
model = Course
If I render the ModelForm
object directly in a template by just referncing a variable, say form
, which got passed down, the Departments appear in a drop-down box (an HTML select box). So far so good.
The problem is: the items in the select box are sorted by ID. So they appear as:
But, I want them sorted alphabetically, i.e.
How can I change the way these items are sorted in the ModelForm
code, or in the Model
code, rather than in the template?
And in general, how can I customize the way a particular field or widget works when generated by a ModelForm
?
How can I change the way these items are sorted in the ModelForm code, or in the Model code, rather than in the template?
One thing you can do is add an ordering
meta option. You do this by adding a Meta
inner class to a class, with the ordering
attribute specified:
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
class Meta:
ordering = ["name"]
Note that this changes default ordering for Department
models (not just when used in a form).
And in general, how can I customize the way a particular field or widget works when generated by a ModelForm?
You'll want to read the Django docs about ModelForm
and built-in form fields. In particular, pay attention to the optional widget
attribute, which allows you to change a form field's widget. The difference types of widgets are described here.
mipadi has shown you how to modify the ordering for your Department model, and this is reflected in the form widget.
However, if you only wanted to change the ordering for that widget, and leave the model's default ordering as something else, you could do this:
class CourseForm(ModelForm):
department = forms.ModelChoiceField(
queryset=Department.objects.order_by('name'))
class Meta:
model = Course
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With