Django 的内联管理:“预填充”字段

问题描述 投票:0回答:2

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

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

我遇到了麻烦,因为我想让它成为每个创建的表单的“默认”字段,因为它在每种情况下都是必要的(顺便说一句,它在这里无关紧要,但是这个字段对应于地图上的一个点)。

此 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,)
#...

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

重要提示:我在这里搜索了类似的问题,甚至用谷歌搜索了这个问题。 我发现了一些老问题(全部来自 2014 年或更早的问题)提到了 Django 不直接提供这种可能性。鉴于我是 Django 初学者,答案涉及一些复杂/令人困惑的建议。

python django django-forms django-admin
2个回答
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,)

0
投票

这是在 Django 管理面板中为 InlineModelAdmin

 添加 
default(per-filled) data简单可行的方法

class FieldAdmin(admin.TabularInline):
    model = Field
    fields = ('type', 'amount')

    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        formset.form.base_fields['amount'].initial = 20
        return formset
© www.soinside.com 2019 - 2024. All rights reserved.