У меня есть модель django, представляющая задачу. Эта задача будет проходить через несколько состояний от «ПРОЕКТ» до «ЗАВЕРШЕНИЯ», и в течение этого времени различные поля будут меняться от требования ввода пользователя, чтобы явно отказаться от него. Например, вы не можете изменить дату выполнения задачи, пока она находится в черновике. Кроме того, я хочу, чтобы на странице отображались разные ссылки, т. Е. Если они находятся в проверке, я хочу, чтобы кнопка отправки сказала «Завершить эту задачу»)Как обрабатывать состояние/условно изменять поля в формах Django
Первоначально Предполагалось, что статус будет моделью в ее собственном но не смог бы выработать способ - помимо жесткого кодирования - что принесло бы какую-либо ценность этим моделям, поэтому вместо этого выбирался явный список. (Любые лучшие подходы здесь будут оценены).
Основная проблема, с которой я сталкиваюсь, заключается в том, как управлять этими полями и их состояниями. Похоже, что самым легким было бы иметь условные утверждения в шаблоне, например {% if task.status = 'ACCEPTED'%}, но это похоже на то, что в шаблон вставляется очень много бизнес-логики. У меня также создается впечатление, что отключение поля, когда вы уже находитесь в шаблоне, намного сложнее, чем форма.
Мой нынешний подход - использовать представление для управления этими состояниями, но это кажется беспорядочным и не позволяет мне решить, как изменить имена ссылок и т. П. В шаблоне.
if task.status = Task.ACCEPTED:
form.fields['datereceived'].disabled = True
if task.status = Task.COMPLETED:
...
ли вид места, чтобы управлять этим и есть более вещие/djangonic управлять ими без перегрузки шаблона?
Пример кода поэтому извини ошибки:
Модель
class Task(models.Model):
STATUS_CHOICES = (
(DRAFT, DRAFT),
(ALLOCATED, ALLOCATED),
(ACCEPTED, ACCEPTED),
(CHECKING, CHECKING),
(COMPLETED, COMPLETED),
(WITHDRAWN, WITHDRAWN),
(ON_HOLD, ON_HOLD),
)
status = models.CharField(max_length=20, choices=STATUS_CHOICES,default=DRAFT)
datereceived = models.DateField(blank=True, null=True)
dateworked = models.DateField(blank=True, null=True)
datechecked = models.DateField(blank=True, null=True)
datecompleted = models.DateField(blank=True, null=True)
datedue = models.DateField(blank=True, null=True)
ModelForm
class TaskForm(forms.ModelForm):
class Meta:
model = Task
#fields = All fields listed individually but hard to pick out for sample
widgets = {
'datereceived': forms.DateInput(attrs={'class':'datepicker'}),
'datedue': forms.DateInput(attrs={'class':'datepicker'}),
'datecompleted': forms.DateInput(attrs={'class':'datepicker'}),
}
Интересно. Я не слишком четко понимаю, как работают классы в django ... В настоящее время я делаю код ниже - когда форма успешно завершена, она перенаправляется обратно на страницу формы. Если бы это позволило ему изменить состояние, когда это произошло (например, status = ACCEPTED - форма изменения означает, что она завершена, экземпляр задачи сохранен - переизданная форма теперь будет показывать разные поля отключены) if taskno: context ['task'] = get_object_or_404 (Задача, pk = taskno) form = TaskForm (request.POST или None, instance = context ['task']) – Ewanw
@Ewanw Да, это должно работать. Дайте нам знать, как это происходит. –
@YarathROCK До сих пор так хорошо. По http://stackoverflow.com/questions/38235623/avoiding-fresh-instantiation-of-modelform-fields-in-django Я борюсь с управлением формой. Мне также приходится делать гораздо больше манипуляций с шаблонами, чем я надеялся контролировать состояния (то есть показывать правильные кнопки для правильного состояния), но я думаю, это неизбежно. – Ewanw