gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:38 26 4
gpt4 key购买 nike

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

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

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

我当前的方法是使用 View 来管理这些状态,但这看起来很困惑,并且(对我来说)没有解决如何更改模板中的链接名称等问题。

if task.status = Task.ACCEPTED:
form.fields['datereceived'].disabled = True
if task.status = Task.COMPLETED:
...

View 是管理这些的地方吗?是否有更多的 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)

模型形式

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)

关于python - 如何处理 Django 表单中的状态/有条件修改字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38193293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com