Выбор порядка выбора моделей Django
При отображении следующих вариантов я хочу иметь возможность упорядочить их следующим образом Подготовка, Обзор, Обновление, Доработка и Завершение.
Сейчас они упорядочены в алфавитном порядке.
Ниже представлена простая модель:
class Choice(models.Model):
status_choices = [
("", "Select Current Status"),
("Preparation", "Preparation"),
("Review", "Review"),
("Update", "Update"),
("Finalised", "Finalised"),
("Completed", "Completed"),
]
current_status = models.CharField(
max_length=32,
choices = status_choices,
default = "Select current status",
)
class Meta:
ordering = ["current_status"]
Я читал, что присвоение номера в кортеже может позволить упорядочить их, что я и попробовал сделать в соответствии с приведенным ниже описанием:
status_choices = [
("", "Select Current Status"),
("1", "Preparation"),
("2", "Review"),
("3", "Update"),
("4", "Finalised"),
("5", "Completed"),
]
Однако это ничего не изменило.
forms.py перечисленные ниже:
class TaskForm(ModelForm):
class Meta:
model = Choice
fields = [
'current_status',
]
widgets = {
'current_status' : forms.Select(attrs={'placeholder':'Select Current Status', 'class':'table_data_request_status'}),
}
Мне кажется, что это должно быть очень просто, но, возможно, это не так.
Любая помощь будет очень признательна. Я просмотрел предыдущие вопросы, но безуспешно.
Я не уверен на 100%, как происходит упорядочивание чисел в charfields, но вы можете попробовать сделать число явным, изменив поле на smallintegerfield, как например:
class Choice(models.Model):
PREPARATION = 1
REVIEW = 2
UPDATE = 3
FINALISED = 4
COMPLETED = 5
status_choices = [
("", "Select Current Status"),
(PREPARATION, "Preparation"),
(REVIEW, "Review"),
(UPDATE, "Update"),
(FINALISED, "Finalised"),
(COMPLETED, "Completed"),
]
current_status = models.SmallIntegerField(
choices = status_choices,
default = 0
)
class Meta:
ordering = ["current_status"]
Одним из преимуществ такого подхода является то, что вы можете использовать более читаемую ссылку на константу модели, сохраняя при этом преимущества числового порядка, например,
if choice_instance.current_status > Choice.UPDATE:
Из вашего вопроса я не понял, есть ли у вас проблемы с упорядочиванием самого виджета select. Если вышесказанное не поможет с виджетом, вы можете попробовать явно обратиться к списку status_choices, например,
widgets = {
'current_status' : forms.Select(choices = Choice.status_choices, attrs={'placeholder':'Select Current Status', 'class':'table_data_request_status'}),
}