6

次のコードを使用してカスタム フィールドを InlineFormset に追加しようとしていますが、フィールドが Django Admin に表示されません。これを許可するには、InlineFormset があまりにもロックダウンされていますか? 私の印刷「ding」テストは期待どおりに起動し、form.fields を印刷してそこにすべて表示できますが、実際のフィールドは admin でレンダリングされません。

admin.py

from django.contrib import admin
import models
from django.forms.models import BaseInlineFormSet
from django import forms
from forms import ProgressForm
from django.template.defaultfilters import slugify

class ProgressInlineFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        print "ding"
        super(ProgressInlineFormset, self).add_fields(form, index)
        for criterion in models.Criterion.objects.all():
            form.fields[slugify(criterion.name)] = forms.IntegerField(label=criterion.name)

class ProgressInline(admin.TabularInline):
    model = models.Progress
    extra = 8
    formset = ProgressInlineFormset

class ReportAdmin(admin.ModelAdmin):
    list_display = ("name", "pdf_column",)
    search_fields = ["name",]
    inlines = (ProgressInline,)

admin.site.register(models.Report, ReportAdmin)
4

3 に答える 3

5

私は別の方法でそれをしました:

フォーム.py:

from django import forms
class ItemAddForm(forms.ModelForm):
    my_new_field = forms.IntegerField(initial=1, label='quantity')
    class Meta:
        model = Item

admin.py:

from django.contrib import admin
from forms import *
class ItemAddInline(admin.TabularInline):
    form = ItemAddForm

これはこれまでのところうまくいきます。この新しいフィールドを処理するには、何らかの方法で save メソッドをオーバーライドするだけです。これを参照してください: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form。デフォルトでは、インラインは baseModelForm を使用し、これは formset_factory に送信されます。BaseModelForm をエラーでサブクラス化しようとしました (属性 '_meta' なし)。そのため、代わりに ModelForm を使用します。

于 2010-02-12T10:06:37.487 に答える
2

別の方法でそれを行うことができます (動的フォーム):

admin.py

class ProgressInline(admin.TabularInline):
    model = models.Progress
    extra = 8

    def get_formset(self, request, obj=None, **kwargs):
        extra_fields = {'my_field': forms.CharField()}
        kwargs['form'] = type('ProgressForm', (forms.ModelForm,), extra_fields)
        return super(ProgressInline, self).get_formset(request, obj, **kwargs)
于 2014-11-14T08:27:09.530 に答える
1
model = models.Progress

admin には、このProgressモデルで定義されたフィールドのみがあります。それを上書きするフィールド/フィールドセットオプションはありません。

新しいものを追加する場合は、次の 2 つのオプションがあります。

  • モデル定義で、これらの新しい追加フィールドを追加します (オプションにします)。
  • admin モデル ( admin.TabularInline ) で、次のようなものを追加します。

    フィールド = ('newfield1', 'newfield2', 'newfield3')

fieldsfieldsetを見てください。

于 2009-02-09T12:12:45.163 に答える