2

複雑な modelForm フォームセットを表に表示しようとしています。私のモデルは次のようなものです:

class Parent(models.Model):
    # whatever
    pass

class Child(models.Model):
    CHOICES1 = (1,2,3)
    CHOICES2 = (1,2)
    CHOICES3 = (1,2,3,4)
    parent = models.ForeignKey('Parent')
    one = models.CharField(max_length=1, choices=CHOICES1)
    two = models.CharField(max_length=1, choices=CHOICES2)
    three = models.CharField(max_length=1, choices=CHOICES3)
    var = models.CharField(max_length=64)

... Parent の各オブジェクトには多くの Children (この場合は 20) があります。CHOICES1、CHOICES2、および CHOICES3 の組み合わせごとに 1 つのインスタンス。var特定の親の各子のフィールドを編集するフォームが必要です。したがって、私のフォームは次のようになります。

class ChildForm(forms.ModelForm):
    class Meta:
        model = Child
        hidden = ('parent', 'one', 'two', 'three') 
        # i.e. only var is the only visible form field.

children_formset = modelformset_factory(Child, form=ChildForm)

これをループして、1 列と 20 行の素敵なテーブルを作成できますが、たとえば、「1」と「2」は単なるラベルですが、var1.1.1 ... var3.3.3 は、この正方形を作成するにはどうすればよいですか?varフォームセット内のフォームごとに 1 つのテーブル セルを含む、フォームセットからのフォーム フィールド。

|CHOICE1 | CHOICE2  | CHOICE3.1   | CHOICE3.2  | CHOICE3.3   
|=========================================================
|   1    |     1    |  var1.1.1   |  var1.1.2  | var1.1.3
|   1    |     2    |  var1.2.1   |  var1.2.2  | var1.2.3 
|   2    |     1    |  var2.1.1   |  var2.1.2  | var2.1.3
|   2    |     2    |  var2.2.1   |  var2.2.2  | var2.2.3
|   3    |     1    |  var3.1.1   |  var3.1.2  | var3.1.3
|   3    |     2    |  var3.2.1   |  var3.2.2  | var3.3.3

(ASCIIを許してください)。

これらをループして、3 番目のセルごとに a を挿入できます。しかし、私は入力が混同されることを本当に望んでいません (つまり、フォーム送信でエラーが発生するとどうなりますか?フォームセット内のフォームの正しい順序を確認するにはどうすればよいですか?)

ハードコードすることもできますが、選択肢の数はプロジェクトが進むにつれて変わる可能性があります。

では、これに対処する最善の方法は何ですか?私が持っていた 1 つのアイデアは、モデル フォームを避けて、1.1.1 から 3.3.3 までの 20 のフィールドを持つ別のフォームを作成することでした。自分で手動で行うのですが、もっと簡単なことはありますか?

4

0 に答える 0