Python 如何处理Django表单中的状态/有条件修改字段

Python 如何处理Django表单中的状态/有条件修改字段,python,django,Python,Django,我有一个代表任务的django模型。此任务将经历从“草稿”到“完成”的多个状态,在此期间,各个字段将从要求用户输入变为明确拒绝。例如,在任务处于草稿状态时,不能更改任务的完成日期。此外,我希望根据状态在页面上显示不同的链接(即,如果正在检查,我希望提交按钮显示“完成此任务”) 我最初计划将状态本身作为一个模型,但除了硬编码之外,无法找到一种方法为这些模型带来任何价值,因此选择了一个明确的列表。(如果这里有更好的方法,我们将不胜感激) 我面临的关键问题是如何管理这些字段及其状态。似乎最简单的方法是

我有一个代表任务的django模型。此任务将经历从“草稿”到“完成”的多个状态,在此期间,各个字段将从要求用户输入变为明确拒绝。例如,在任务处于草稿状态时,不能更改任务的完成日期。此外,我希望根据状态在页面上显示不同的链接(即,如果正在检查,我希望提交按钮显示“完成此任务”)

我最初计划将状态本身作为一个模型,但除了硬编码之外,无法找到一种方法为这些模型带来任何价值,因此选择了一个明确的列表。(如果这里有更好的方法,我们将不胜感激)

我面临的关键问题是如何管理这些字段及其状态。似乎最简单的方法是在模板中使用条件语句,如{%if task.status='ACCEPTED'%},但这似乎将大量业务逻辑放入了模板中。我还得到一个印象,一旦你已经在一个模板中,禁用一个字段要比表单困难得多

我目前的方法是使用视图来管理这些状态,但这看起来很混乱,并且(对我来说)无法解决如何更改模板中的链接名称等问题

if task.status = Task.ACCEPTED:
    form.fields['datereceived'].disabled = True
if task.status = Task.COMPLETED:
    ...
视图是管理这些内容的地方吗?是否有一个更具pythonic/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'}),
    }

尝试将逻辑放入表单实例化代码中,如下所示:

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)      

可以使用有限状态机。django fsm处理任务状态。在这里,您可以定义每个转换的源状态和目标状态。作为参考,你可以看到这个例子

有趣。我不太清楚django的课程是如何运作的。。。我现在执行下面的代码-当表单成功完成时,它会重定向回表单页面。如果taskno:context['task']=get_object\u或_404(task,pk=taskno)form=TaskForm(request.POST或None,instance=context['task']),这是否允许它在发生这种情况时更改状态(即状态=已接受-表单更改意味着它现在已完成,任务实例已保存-重新发布的表单现在将显示禁用的不同字段)@是的,那应该行。让我们知道进展如何。@YarathROCK到目前为止,一切都很好。据我所知,我正在努力进行表单管理。我还必须做比我希望控制状态更多的模板操作(即显示正确状态的向右按钮),但我想这是不可避免的。@ewawh我记得也有这个问题;张贴我的解决方案+1问Qs,不过…