2

フォームセットを使用して表示される Django オートフィールドは、デフォルトで非表示になっています。それを示す最良の方法は何でしょうか?

現時点では、モデルは次のように宣言されています。

class MyModel:
   locid = models.AutoField(primary_key=True)
   ...

これを Django フォームセットを使用してレンダリングすると、

class MyModelForm(ModelForm):
  class Meta:
    model = MyModel
    fields = ('locid', 'name')

ページに次のように表示されます。

<input id="id_form-0-locid" type="hidden" value="707" name="form-0-locid"/>

ありがとう。


編集

私はこのようなフォームセットを作成します -

LocFormSet = modelformset_factory(MyModel) 
pformset = LocFormSet(request.POST, request.FILES, queryset=MyModel.objects.order_by('name')) 

2 回目の編集

そこで定義したカスタムフォームクラスを使用していないように見えるので、質問を少し変更する必要があります..

カスタム フォーム (隠しフィールドを表示する) からフォームセットを作成し、カスタム クエリセットを使用するにはどうすればよいですか?

現時点では、BaseModelFormSet クラスから継承してカスタム クエリ セットを使用するか、ModelForm クラスを使用してフォームにカスタム フィールドを追加することができます。フォームセットで両方を行う方法はありますか?


3 回目の編集

今使っている、

class MyModelForm(ModelForm):
  def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    locid = forms.IntegerField(min_value = 1, required=True)
    self.fields['locid'].widget.attrs["type"] = 'visible'
    self.queryset = MyModel.objects.order_by('name')
  class Meta:
    model = MyModel
    fields = ('locid', 'name')

LocFormSet = modelformset_factory(MyModel, form = MyModelForm)
pformset = LocFormSet()

しかし、これはまだありません

  • ローシッドを表示
  • 指定されたカスタム クエリを使用します。
4

4 に答える 4

2

デフォルトのフィールド タイプを変更してみてください。

from django import forms
class MyModelForm(ModelForm):
  locid = forms.IntegerField(min_value=1, required=True)
  class Meta:
    model = MyModel
    fields = ('locid', 'name')

編集:テスト済みで動作します...

于 2009-05-22T02:34:17.333 に答える
1

あなたが言うように、あなたはあなたが定義したカスタムフォームを使用していません。これは、どこにも渡していないため、Djangoがそれを認識できないためです。

解決策は簡単です。カスタムフォームクラスをmodelformset_factoryに渡すだけです。

LocFormSet = modelformset_factory(MyModel, form=MyModelForm) 

アップデート3に応じて編集します。

まず、locidの再定義が間違った場所にあります。これは、内ではなく、クラスレベルである必要があります__init__

次に、クエリセットをフォーム内に配置ても、何も実行されません。フォームはクエリセットについて認識しません。フォームセットをインスタンス化するときにパラメータとして渡して、前に行っていたことに戻る必要があります。(または、カスタムフォームセットを定義することもできますが、それはやり過ぎのようです。)

class MyModelForm(ModelForm):
    locid = forms.IntegerField(min_value=1, required=True)

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['locid'].widget.attrs["type"] = 'visible'
    class Meta:
        model = MyModel
        fields = ('locid', 'name')

LocFormSet = modelformset_factory(MyModel, form = MyModelForm)
pformset = LocFormSet(request.POST, request.FILES,
                      queryset=MyModel.objects.order_by('name')))
于 2009-05-22T08:59:29.277 に答える
0

さて、上記のアプローチはどれも私にはうまくいきませんでした。ついにテンプレート側からこの問題を解決しました。

表示されます。これはパッチとして利用可能であり、「patch-p0file.patch」を使用してdjangoのSVNバージョンにインストールできます。

  • {{form.locid.value}}変数は、非表示のフォームと組み合わせて使用​​されることに注意してください。そうしないと、フォームセットの送信および保存操作がクラッシュします。

  • これは{{form.locid.data}}と同じではありません-上記のチケットで説明されているように。

于 2009-05-24T01:25:51.293 に答える
0

自動フィールドが非表示になっている理由は、BaseModelFormSet と BaseInlineFormSet の両方が add_field でそのフィールドをオーバーライドするためです。これを修正する方法は、独自のフォームセットを作成し、super を呼び出さずに add_field をオーバーライドすることです。また、主キーを明示的に定義する必要はありません。

フォームセットを modelformset_factory に渡す必要があります。

    LocFormSet = modelformset_factory(MyModel, 
           formset=VisiblePrimaryKeyFormSet)

これは、フォームセット クラスにあります。

from django.forms.models import BaseInlineFormSet, BaseModelFormSet, IntegerField
from django.forms.formsets import BaseFormSet

class VisiblePrimaryKeyFormset(BaseModelFormSet):
    def add_fields(self, form, index):
        self._pk_field = pk = self.model._meta.pk
        if form.is_bound:
            pk_value = form.instance.pk
        else:
            try:
                pk_value = self.get_queryset()[index].pk
            except IndexError:
                pk_value = None
        form.fields[self._pk_field.name] = IntegerField( initial=pk_value,
                 required=True) #or any other field you would like to display the pk in
        BaseFormSet.add_fields(self, form, index) # call baseformset which does not modify your primary key field
于 2009-08-12T14:51:02.770 に答える