我有一个管理处理作业的 Django 应用程序,我正在尝试创建一个用户友好的流程请求表单。基本上,有一个 Process 模型定义了一个流程,并有一个相关的 ProcessInput 模型来定义输入参数。镜像这两个模型以创建流程的“实例”是 ProcessRequest 和 ProcessRequestInputValue 模型。
这里的要求是,对于一个新的 ProcessRequest,必须有一套完整的 ProcessRequestInputValues 匹配所有的 ProcessInputs。目前,我正在使用 inlineformset_factory 创建用于提交流程请求的表单,该表单允许同时输入所有输入值。我还提供了初始数据来预填充输入选项。这是可行的,但用户可以更改输入值类别,因为它是一个 ModelChoiceField。我想“修复”这个值并将其显示为文本,本质上是一个只读文本小部件。
这是相关的代码。一、机型:
class Process(models.Model):
process_name = models.CharField(unique=True)
class ProcessInput(models.Model):
process = models.ForeignKey(Process)
input_name = models.CharField()
default_value = models.CharField(null=True, blank=True, max_length=1024)
class Meta:
unique_together = (('process', 'input_name'),)
class ProcessRequest(models.Model):
process = models.ForeignKey(Process)
request_user = models.ForeignKey(User, editable=False)
class ProcessRequestInputValue(models.Model):
process_request = models.ForeignKey(ProcessRequest)
process_input = models.ForeignKey(ProcessInput)
value = models.CharField(null=False, blank=False, max_length=1024)
class Meta:
unique_together = (('process_request', 'process_input'),)
表格很简单:
class ProcessRequestForm(ModelForm):
class Meta:
model = ProcessRequest
exclude = ('process', 'request_user')
class ProcessRequestInputValueForm(ModelForm):
class Meta:
model = ProcessRequestInputValue
exclude = ('process_request',)
最后是表单集视图中的代码:
PRInputValueFormSet = inlineformset_factory(
ProcessRequest,
ProcessRequestInputValue,
form=ProcessRequestInputValueForm,
extra=process.processinput_set.count(),
can_delete=False,
)
form = ProcessRequestForm(instance=process_request)
initial_data = list()
for process_input in process.processinput_set.all():
initial_data.append({'process_input': process_input})
formset = PRInputValueFormSet(
instance=process_request,
initial=initial_data)
这很有效,它保留了有关表单错误的所有填写信息。但是,就像我在上面所说的那样,表单将流程输入显示为下拉列表,因为它是一个 ModelChoiceField。
例如,假设我们有一个名为“Add Numbers”的进程,并且有 2 个输入“NumberA”和“NumberB”。这是带有表单集的 ProcessRequest 表单的屏幕截图:
我想基本上将选择显示为值的标签。我尝试了几种方法,但没有找到任何效果很好的方法。有任何想法吗?