我如何在 Django Admin 中要求内联?

新手上路,请多包涵

我有以下管理设置,以便我可以同时添加/编辑用户及其个人资料。

 class ProfileInline(admin.StackedInline):
    """
    Allows profile to be added when creating user
    """
    model = Profile

class UserProfileAdmin(admin.ModelAdmin):
    """
    Options for the admin interface
    """
    inlines = [ProfileInline]
    list_display = ['edit_obj', 'name', 'username', 'email', 'is_active',
        'last_login', 'delete_obj']
    list_display_links = ['username']
    list_filter = ['is_active']
    fieldsets = (
        (None, {
            'fields': ('first_name', 'last_name', 'email', 'username',
                'is_active', 'is_superuser')}),
        )
    ordering = ['last_name', 'first_name']
    search_fields = ['first_name', 'last_name']

admin.site.register(User, UserProfileAdmin)

问题是在添加用户时我需要配置文件内联表单中的两个字段。除非输入输入,否则内联表单不会验证。有没有办法使内联成为必需的,这样它就不能留空?

原文由 AJ. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 711
2 个回答

我采纳了 Carl 的建议并做了比我在对他的回答的评论中提到的 hack-ish 更好的实现。这是我的解决方案:

从我的 forms.py 中:

 from django.forms.models import BaseInlineFormSet

class RequiredInlineFormSet(BaseInlineFormSet):
    """
    Generates an inline formset that is required
    """

    def _construct_form(self, i, **kwargs):
        """
        Override the method to change the form attribute empty_permitted
        """
        form = super(RequiredInlineFormSet, self)._construct_form(i, **kwargs)
        form.empty_permitted = False
        return form

和 admin.py

 class ProfileInline(admin.StackedInline):
    """
    Allows profile to be added when creating user
    """
    model = Profile
    extra = 1
    max_num = 1
    formset = RequiredInlineFormSet

class UserProfileAdmin(admin.ModelAdmin):
    """
    Options for the admin interface
    """
    inlines = [ProfileInline]
    list_display = ['edit_obj', 'name', 'username', 'email', 'is_active',
        'last_login', 'delete_obj']
    list_display_links = ['username']
    list_filter = ['is_active']
    fieldsets = (
        (None, {
            'fields': ('first_name', 'last_name', 'email', 'username',
                'is_active', 'is_superuser')}),
        (('Groups'), {'fields': ('groups', )}),
    )
    ordering = ['last_name', 'first_name']
    search_fields = ['first_name', 'last_name']

admin.site.register(User, UserProfileAdmin)

这正是我想要的,它使配置文件内联表单集有效。因此,由于配置文件表单中有必填字段,如果未在内联表单中输入所需信息,它将验证并失败。

原文由 AJ. 发布,翻译遵循 CC BY-SA 3.0 许可协议

现在使用 Django 1.7,您可以使用参数 min_num 。您不再需要课程 RequiredInlineFormSet

请参阅 https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.min_num

 class ProfileInline(admin.StackedInline):
    """
    Allows profile to be added when creating user
    """
    model = Profile
    extra = 1
    max_num = 1
    min_num = 1 # new in Django 1.7

class UserProfileAdmin(admin.ModelAdmin):
    """
    Options for the admin interface
    """
    inlines = [ProfileInline]
    ...

admin.site.register(User, UserProfileAdmin)

原文由 quick 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题