私は、ForeignKey を持つ別のモデルへの ForeignKey を持つモデルを持っています。inlineformset フレンドリーではない django フォーム ウィザード (可能な限り古いバージョンの django をサポートしようとしている) でレンダリングしています。ユーザーがモデルと追加情報の両方をフォーム ウィザードに入力し、それを正しい pk 値に変換してもらいたい (追加情報が組み合わせに依存するようにする) これにアプローチする最善の方法について疑問に思っています。
コードでさらに明確にする。私は3つのモデルを持っています:
class Subject(models.Model):
title = models.CharField(...)
extra_info = models.CharField(...)
class Topic(models.Model):
title = models.CharField(...)
extra_info = models.CharField(...)
subject = models.ForeignKey(Subject)
class AwesomeThing(models.Model):
title = models.CharField(...)
topic = models.ForeignKey(Topic)
ここで、フォーム ウィザードでAwesomThingのトピックフィールドを4 つのフィールドとしてユーザーに提示したいと考えています。
- 主題
- 件名追加情報
- トピック
- トピックの追加情報
これを達成するためにMultiValueFieldとMultiWidgetを使用していますが、値を保持してフォーム ウィザードのステップ間で転送する最良の方法がわかりません。私はこれを行うことができますが、私のメソッドがデータベースに頻繁にヒットするのではないかと心配しています. これが私が現在これを行う方法です:
class SubjectTopicField(MultiValueField):
widget = SubjectTopicInput # Multiwidget to present four input fields
hidden_widget = HiddenInput
def __init__(self, *args, **kwargs):
fields = (
CharField(label='Subject'),
CharField(label='Subject extra information'),
CharField(label='Topics'),
CharField(label='Topic extra information'),
)
super(SubjectTopicField, self).__init__(fields, *args, **kwargs)
def compress(self, data_list):
# If all four fields are present ...
if data_list and len(data_list) == 4:
# ... call and return the topic 'pk' value from a custom method that
# creates and/or gets the topic based on the subject and topic info
return get_or_create_topic(data_list[0], data_list[1], # Subject
data_list[2], data_list[3]) # Topic
return None
私の get_or_create_topic メソッドは基本的に、件名とトピックのこの組み合わせが存在するかどうかを調べ、存在する場合はそれを返し、存在しない場合は作成します。問題は、これがすべてのステップでデータベースにアクセスする必要があることです。このフィールドの隠しフィールド プレゼンテーションは、トピックの pk 値ではなく、値のリスト (data_list) を保持しているだけであることがわかります。私の意見では、それは最適ではありません。これを行うより良い方法はありますか?これをMultiValueFieldで機能させることに集中するだけかもしれませんが、これを行う適切な方法がわかりません。