2016-07-04 2 views
1

У меня есть модель 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'}), 
    } 

ответ

1

Попробуйте положить логику в коде создания экземпляра формы, как так:

class TaskForm(forms.ModelForm): 
    class Meta: 
     model = Task 

    def handle_state(self, *args, **kwargs): 
     task = getattr(self, 'instance', None) 
     if task:  
      if task.status = Task.ACCEPTED: 
       self.fields['datereceived'].disabled = True 
      elif task.status = Task.COMPLETED: 
       ... 

    def __init__(self, *args, **kwargs): 
     super(TaskForm, self).__init__(*args, **kwargs) 
     self.handle_state(*args, **kwargs)  
+0

Интересно. Я не слишком четко понимаю, как работают классы в django ... В настоящее время я делаю код ниже - когда форма успешно завершена, она перенаправляется обратно на страницу формы. Если бы это позволило ему изменить состояние, когда это произошло (например, status = ACCEPTED - форма изменения означает, что она завершена, экземпляр задачи сохранен - ​​переизданная форма теперь будет показывать разные поля отключены) if taskno: context ['task'] = get_object_or_404 (Задача, pk = taskno) form = TaskForm (request.POST или None, instance = context ['task']) – Ewanw

+0

@Ewanw Да, это должно работать. Дайте нам знать, как это происходит. –

+0

@YarathROCK До сих пор так хорошо. По http://stackoverflow.com/questions/38235623/avoiding-fresh-instantiation-of-modelform-fields-in-django Я борюсь с управлением формой. Мне также приходится делать гораздо больше манипуляций с шаблонами, чем я надеялся контролировать состояния (то есть показывать правильные кнопки для правильного состояния), но я думаю, это неизбежно. – Ewanw

Смежные вопросы