Django 1.5 管理员界面的 inline extra

14

我有一些拥有大量内联对象的模型。由于并非每个对象都需要所有内联对象,因此我使用了extra=0来定义内联模型,以便在内联上显示一个小的添加+按钮。

然而,在django 1.5中,这似乎不再起作用。如果设置了extra=0,则无法编辑内联对象。

有没有办法将1.4的行为带入到1.5中呢?

示例代码:

class ModelInline(admin.StackedInline):
    model = MyModel
    extra = 0

class OtherModelAdmin(admin.ModelAdmin)
    inlines = [ModelInline]

admin.site.register(OtherModel, OtherModelAdmin)

编辑(某些屏幕):

Django 1.4: django 1.4 extra=0

Django 1.5: enter image description here

(Hinzufügen == 添加)


这里看到示例代码会很好。 - Andrew Sledge
k,添加了一些示例代码 - Jay
5个回答

8

这已经发生过了。

The new javascript made this impossible because the "Add Another" button 
was controlled by max_num, and ignored a value of 0.
The javascript ignored a value of 0 because max_num has a default value of 0, 
and all the code using it had taken to equating max_num = 0 with being "off". 
So you can't actually have a maximum of 0. It's not possible.

有一个由Gabrial Hurley创建的补丁可以恢复所需的行为,而不会破坏其他任何内容。这是3年前的事情,我不知道它是否仍适用于Django 1.5。只需尝试即可 :)

https://code.djangoproject.com/attachment/ticket/13023/13023_inlines_patch.diff

这是同一个漏洞的票据(3年前):

https://code.djangoproject.com/ticket/13023


我似乎无法在1.6中应用此代码,因为total_form_count不再在models.py中定义,只在formsets.py中定义,并且代码也不同,所以我不确定该如何更改。有人能帮忙吗? - smwilsonau
在Django 1.6中,它被称为initial_form_count - catherine
谢谢,我找到了相应的代码行并应用了补丁,但我的问题最终证明是另外一件事情... - smwilsonau

2

我也遇到了同样的问题,因为我把静态管理内容放在了django安装目录之外的一个目录里。将Django 1.5的静态内容从django/contrib/admin/static/admin/js/复制到STATIC_ROOT/admin/js中可以解决这个问题。


1
那实际上不是一个好主意。当你在某个时刻升级Django版本时,你会遇到麻烦,因为你看不到这些静态文件的新版本(我就遇到过这样的问题)。如果你以正确的方式提供静态内容(https://docs.djangoproject.com/en/dev/howto/static-files/),你应该不会有任何问题。 - nivcaner

0

更好的解决方案是覆盖内联自身的get_extra方法。这适用于Django 1.9,尽管我不能确定早期版本。


0
如果“extra”字段无法使用,请按以下方式使用“get_extra()”
class ModelInline(admin.StackedInline):
    model = MyModel
    # extra = 0

    def get_extra(self, request, obj=None, **kwargs):
        return 0 # Is equivalent to "extra = 0"
    
class OtherModelAdmin(admin.ModelAdmin)
    inlines = [ModelInline]
    
admin.site.register(OtherModel, OtherModelAdmin)

0

您所需做的只是添加额外字段。


例如:

  1. models.py:

class Category(models.Model):
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.IntegerField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return '{}, {}'.format(self.name, self.company)

  1. admin.py:
    class InlinesProduct(admin.StackedInline):
        model = Product
        extra = 0     #<=== For remove empty fields from admin view

    @admin.register(Category)
    class CategoryAdmin(admin.ModelAdmin):
        inlines = [InlinesProduct]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接