Django的内联管理员:预先填写的'字段

时间:2016-11-14 03:34:43

标签: python django django-forms django-admin

我正在开发我的第一个Django项目,我希望用户能够在管理员中创建自定义表单,并根据需要添加字段他们。为此,我在我的项目中添加了一个可重用的应用程序,可以在github上找到:

  

https://github.com/stephenmcd/django-forms-builder

我遇到了麻烦,因为我想这样做,所以1个特定字段是&#39;默认&#39;因为它在每种情况下都是必要的(因为在我看来,它在这里是不相关的,但是这个字段对应于地图上的一个点)。< / p>

此django-forms-builder应用程序中的一段重要代码,显示 admin.TabularInline 的使用:

#admin.py
#...
class FieldAdmin(admin.TabularInline):
    model = Field
    exclude = ('slug', )


class FormAdmin(admin.ModelAdmin):
    formentry_model = FormEntry
    fieldentry_model = FieldEntry

    inlines = (FieldAdmin,)
#...

所以我的问题是:是否有任何简单的方法可以为管理员添加默认(已填充的字段)TabularInline&#39;在最近的Django版本中?如果不可能的话,我真的很感激指向某个地方,我可以学习如何解决这个问题。

重要提示:我在这里搜索过类似的问题,甚至用Google搜索了问题。 我发现了一些旧问题(全部来自2014年或更早版本)提到这种可能性并非由Django直接提供。考虑到我是一名Django初学者,答案涉及一些复杂/混乱的建议。

1 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标。

1:在模型中的字段上设置默认值。

Django的动态管理表单和内联非常智能,可以检测到这一点,并自动将其显示为默认选项或条目。

class Book(models.Model):

    rating = models.IntegerField(default=0)

2:在TabularInline类中使用自定义表单。

class BookInlineForm(models.ModelForm):

    class Meta:
        model = Book
        fields = ('rating', )

    def __init__(self, *args, **kwargs):
        initial = kwargs.pop('initial', {})
        # add a default rating if one hasn't been passed in
        initial['rating'] = initial.get('rating', 0)
        kwargs['initial'] = initial
        super(BookInlineForm, self).__init__(
            *args, **kwargs
        )


class BookTabularInline(admin.TabularInline):
    model = Book
    form = BookInlineForm


class ShelfAdmin(admin.ModelAdmin):
    inlines = (BookAdmin,)