Python 如何处理Django表单中的状态/有条件修改字段
我有一个代表任务的django模型。此任务将经历从“草稿”到“完成”的多个状态,在此期间,各个字段将从要求用户输入变为明确拒绝。例如,在任务处于草稿状态时,不能更改任务的完成日期。此外,我希望根据状态在页面上显示不同的链接(即,如果正在检查,我希望提交按钮显示“完成此任务”) 我最初计划将状态本身作为一个模型,但除了硬编码之外,无法找到一种方法为这些模型带来任何价值,因此选择了一个明确的列表。(如果这里有更好的方法,我们将不胜感激) 我面临的关键问题是如何管理这些字段及其状态。似乎最简单的方法是在模板中使用条件语句,如{%if task.status='ACCEPTED'%},但这似乎将大量业务逻辑放入了模板中。我还得到一个印象,一旦你已经在一个模板中,禁用一个字段要比表单困难得多 我目前的方法是使用视图来管理这些状态,但这看起来很混乱,并且(对我来说)无法解决如何更改模板中的链接名称等问题Python 如何处理Django表单中的状态/有条件修改字段,python,django,Python,Django,我有一个代表任务的django模型。此任务将经历从“草稿”到“完成”的多个状态,在此期间,各个字段将从要求用户输入变为明确拒绝。例如,在任务处于草稿状态时,不能更改任务的完成日期。此外,我希望根据状态在页面上显示不同的链接(即,如果正在检查,我希望提交按钮显示“完成此任务”) 我最初计划将状态本身作为一个模型,但除了硬编码之外,无法找到一种方法为这些模型带来任何价值,因此选择了一个明确的列表。(如果这里有更好的方法,我们将不胜感激) 我面临的关键问题是如何管理这些字段及其状态。似乎最简单的方法是
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,不过…