【问题标题】:How to set default values in TabularInline formset in Django admin如何在 Django admin 中的 TabularInline formset 中设置默认值
【发布时间】:2013-02-28 21:21:05
【问题描述】:

如何在 django admin 的内联中设置第一个默认行/值?

    class Employee(models.Model):
        username = models.CharField(_('Username'), max_length=150, null=False, blank=False)
        email = models.CharField(_('Email'), max_length=150, null=False, blank=False)

    class Details(models.Model):
        employee = models.ForeignKey(Employee, verbose_name=_('Employee'), blank=False, null=False)
        label = models.CharField(_('Label'), max_length=150, null=False, blank=False)
        value = models.CharField(_('Value'), max_length=150, null=False, blank=False)


    class DetailsFormset(forms.models.BaseInlineFormSet):
        def __init__(self, *args, **kwargs):
                self.initial = [
{ 'label': 'first name'},  
{'label': 'last name'}, 
{'label': 'job',}]
            super(DetailsFormset, self).__init__(*args, **kwargs)

    class DetailsInline(admin.TabularInline):
        model = Details
        formset = DetailsFormset
        fieldsets = [
                ['', {'fields': ['employee', 'label', 'value']}]
        ]

    class EmployeeAdmin(admin.ModelAdmin):
        inlines = [DetailsInline]

但是这一行不起作用

    self.initial = [
{ 'label': 'first name'},  
{'label': 'last name'}, 
{'label': 'job',}]

如何使用 django admin 设置默认值?

【问题讨论】:

  • 定义doesn't work。结果如何?
  • 我希望第一个默认行是名字、姓氏和工作,但这不能定义任何默认值
  • 只想提一下,对我来说,在 model 上设置默认值要容易得多。

标签: django django-forms django-admin


【解决方案1】:
from django.utils.functional import curry

class DetailsInline(admin.TabularInline):
    model = Details
    formset = DetailsFormset
    extra = 3

    def get_formset(self, request, obj=None, **kwargs):
        initial = []
        if request.method == "GET":
            initial.append({
                'label': 'first name',
            })
        formset = super(DetailsInline, self).get_formset(request, obj, **kwargs)
        formset.__init__ = curry(formset.__init__, initial=initial)
        return formset

从这里:Pre-populate an inline FormSet?

【讨论】:

  • 我希望第一个默认行是名字、姓氏和工作,但它总是设置相同的值
  • 是的,我需要将三个内联行定义为默认静态
  • 好的,我会尝试在我的应用程序中测试它。如果我解决了它,我会发布我的答案
  • 初始值显示在添加表单中,但是当点击保存时,值不会被保存。有什么办法解决这个问题?
  • 在 Django 2.2 中为我工作。就我而言,我只需要非常新表单的初始数据(没有保存/链接对象),所以我最终将if 条件修改为if request.method == "GET" and (not obj or not obj.id):。此外,如果添加初始数据是唯一要求,则无需在类下显式提及formset
【解决方案2】:

如果您需要为创建的新表单定义默认值,您可以重新定义InlineFormSetempty_form 属性:

class MyDefaultFormSet(django.forms.models.BaseInlineFormSet):
    @property
    def empty_form(self):
       form = super(MyDefaultFormSet, self).empty_form
       # you can access self.instance to get the model parent object
       form.fields['label'].initial = 'first name'
       # ...
       return form

 class DetailsInline(admin.TabularInline):
    formset = MyDefaultFormSet

现在,每次添加新表单时,它都会包含您提供给它的初始数据。我已经在 django 1.5 上测试过了。

【讨论】:

    【解决方案3】:

    为了为内联中的所有实例提供静态默认值,我找到了一个更简单的解决方案,只需将其设置为表单:

    class DetailsForm(django_forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['label'] = 'first_name'
    
    
    class DetailsInline(admin.TabularInline):
        form = DetailsForm
        # ...
    

    我认为这不适用于 OP 的特殊情况,因为每个表单的 'label' 字段值不同,但我希望它对将来访问此页面的任何人都有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2021-11-22
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2023-02-18
      • 2013-01-28
      相关资源
      最近更新 更多