代码之家  ›  专栏  ›  技术社区  ›  Soviut

如何向内联表单集添加自定义字段?

  •  7
  • Soviut  · 技术社区  · 16 年前

    我试图使用以下代码将自定义字段添加到InlineFormset中,但这些字段不会显示在Django Admin中。内联表单集是否过于锁定,无法允许这样做?我的打印“丁”测试按预期启动,我可以打印出form.fields并在那里看到它们,但实际的字段从未在管理员中呈现。

    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)
    
    3 回复  |  直到 16 年前
        1
  •  5
  •   alekwisnia    15 年前

    我用另一种方式:

    表格.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
        fields = (..., 'my_new_field')
    

    到目前为止,这是可行的,我只需要以某种方式重写save方法来处理这个新字段。看这个: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form 。它说默认情况下内联使用BaseModelForm,它被发送到formset_factory。它对我不起作用,试图子类化BaseModelForm时出错(没有属性“_meta”)。所以我改用ModelForm。

        2
  •  2
  •   Sultan    11 年前

    您可以通过另一种方式(动态表单)来实现:

    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)
    
        3
  •  1
  •   David Arcos    16 年前
    model = models.Progress
    

    在管理中,只有此中定义的字段 进展 模型。您没有覆盖它的字段/字段集选项。

    如果你想添加新的,有两个选项:

    • 在模型定义中,添加这些新的附加字段(使其成为可选字段!)
    • 在管理模型中( 管理员。表格内联 ),添加类似以下内容:

      fields=('newfield1','newfield2','newfield3')

    看一看 fields , fieldsets .