我正在开发我的第一个 Django 项目,在该项目中,我希望用户能够在管理中创建自定义表单,并根据需要向其中添加字段。为此,我在我的项目中添加了一个可重用的应用程序,可在 github 上找到:
我遇到了麻烦,因为我想让它成为每个创建的表单的“默认”字段,因为它在每种情况下都是必要的(顺便说一句,它在这里无关紧要,但是这个字段对应于地图上的一个点)。
此 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 初学者,答案涉及一些复杂/令人困惑的建议。
有几种方法可以实现这一目标。
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,)
这是在 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