首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将自定义字段添加到InlineFormsets?

如何将自定义字段添加到InlineFormsets?
EN

Stack Overflow用户
提问于 2009-02-09 00:47:25
回答 3查看 6.7K关注 0票数 7

我试图使用下面的代码将自定义字段添加到InlineFormset中,但是字段不会出现在Django管理中。InlineFormset是否太过锁定,不允许这样做?我的打印"ding“测试会像预期的那样触发,我可以打印出form.fields并在那里看到它们,但是实际的字段从未呈现在管理程序中。

admin.py

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-09 12:12:45

代码语言:javascript
运行
复制
model = models.Progress

在admin中,只有在这个进度模型中定义的字段。您没有字段/字段集选项覆盖它。

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

  • 在模型定义中,添加那些新的附加字段(使它们成为可选的!)
  • 在管理模型(admin.TabularInline)中,添加如下内容: 字段=(‘newfield3 1’,‘newfield3 2’,'newfield3')

看看字段场集

票数 0
EN

Stack Overflow用户

发布于 2010-02-12 10:06:37

我做了另一种方式:

forms.py:

代码语言:javascript
运行
复制
from django import forms
class ItemAddForm(forms.ModelForm):
    my_new_field = forms.IntegerField(initial=1, label='quantity')
    class Meta:
        model = Item

admin.py:

代码语言:javascript
运行
复制
from django.contrib import admin
from forms import *
class ItemAddInline(admin.TabularInline):
    form = ItemAddForm
    fields = (..., 'my_new_field')

到目前为止,我只需要覆盖保存方法来处理这个新字段。看这个:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form。它说默认情况下内联使用BaseModelForm,这是发送给formset_factory的。它对我不起作用,尝试用错误子类BaseModelForm (没有属性'_meta')。所以我用ModelForm代替。

票数 6
EN

Stack Overflow用户

发布于 2014-11-14 08:27:09

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

admin.py

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/526795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档