Making inlines conditional in the Django admin

后端 未结 8 2328
长发绾君心
长发绾君心 2021-02-07 21:45

I have a model that I want staff to be able to edit up to the date for the event. Like this:

class ThingAdmin(admin.ModelAdmin):
    model = Thing

    if obj.da         


        
8条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-07 22:36

    Thanks to the comments for a change in 1.4. My implementation here wasn't thread safe either, so it really should have been deleted.

    Since get_formsets is passed the object and calls get_inline_instances, we can modify both functions to act on the object.

    This should work:

    class ThingAdmin(admin.ModelAdmin):
        model = Thing
    
        inlines = [inline]
        other_set_of_inlines = [other_inline]
    
        def get_inline_instances(self, request, obj=None):
            #                                    ^^^ this is new
            inline_instances = []
    
            if obj.date > datetime.date(2012, 1, 1):
                inlines = self.inlines
            else:
                inlines = self.other_set_of_inlines
    
            for inline_class in inlines:
                inline = inline_class(self.model, self.admin_site)
                if request:
                    if not (inline.has_add_permission(request) or
                            inline.has_change_permission(request) or
                            inline.has_delete_permission(request)):
                        continue
                    if not inline.has_add_permission(request):
                        inline.max_num = 0
                inline_instances.append(inline)
            return inline_instances
    
        def get_formsets(self, request, obj=None):
            for inline in self.get_inline_instances(request, obj):
                #                                           ^^^^^ this is new
                yield inline.get_formset(request, obj)
    

提交回复
热议问题