処理ジョブを管理する Django アプリがあり、ユーザー フレンドリーなプロセス リクエスト フォームを作成しようとしています。基本的に、プロセスを定義する Process モデルがあり、関連する ProcessInput モデルが入力パラメーターを定義します。これら 2 つのモデルをミラーリングして Process の「インスタンス」を作成するのが、ProcessRequest および ProcessRequestInputValue モデルです。
ここでの要件は、新しい ProcessRequest には、すべての ProcessInput に一致する ProcessRequestInputValue の完全なセットが存在する必要があるということです。現在、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" というプロセスがあり、"NumberA" と "NumberB" という 2 つの入力があるとします。これは、フォームセットを使用した ProcessRequest フォームからのスクリーン グラブです。
基本的に、選択肢を値のラベルとして表示したいと思います。いくつかのアプローチを試しましたが、うまく機能するものは見つかりませんでした。何か案は?