Making inlines conditional in the Django admin

后端 未结 8 2326
长发绾君心
长发绾君心 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:44

    I had a situation where I needed to show an Inline based on the admin site that you were on for a given story.

    I was able to get dynamic inlines working for Django 1.3 using the following code:

    In highlights/admin.py

    class HighlightInline(generic.GenericTabularInline):
        model = Highlight
        extra = 1
        max_num = 4
        fields = ('order', 'highlight')
        template = 'admin/highlights/inline.html'
    
    class HighlightAdmin(admin.ModelAdmin):
        def regulate_highlight_inlines(self):
            highlights_enabled = Setting.objects.get_or_default('highlights_enabled', default='')
            highlight_inline_instance = HighlightInline(self.model, self.admin_site)
            highlight_found = any(isinstance(x, HighlightInline) for x in self.inline_instances)
            if highlights_enabled.strip().lower() == 'true':
                if not highlight_found:
                    self.inline_instances.insert(0, highlight_inline_instance)
            else:
                if highlight_found:
                    self.inline_instances.pop(0)
            print self.inline_instances
    
        def change_view(self, request, object_id, form_url='', extra_context=None):
            self.regulate_highlight_inlines()
            return super(HighlightAdmin, self).change_view(request, object_id)
    
        def add_view(self, request, form_url='', extra_context=None):
            self.regulate_highlight_inlines()   
            return super(HighlightAdmin, self).add_view(request, form_url, extra_context)
    

    In story/admin.py

    class StoryAdmin(HighlightAdmin):
    

    One thing to note is that I'm not merely manipulating inline classes(HighlightInline) but rather, I'm changing inline instances(HighlightInline(self.model, self.admin_site)). This is because django has already constructed a list of inline instances based on a list of inline classes during the initial construction of the admin class.

    0 讨论(0)
  • 2021-02-07 22:46

    I think the easiest way to hack this is to call your custom funciton in get_fields, or get_fieldsets and so on, just set self.inlines in a custom function.

    class XXXAdmin(admin.ModelAdmin):
        def set_inlines(self, request, obj):
            """ hack inlines models according current request.user or obj """
            self.inlines = []
            if request.user.is_superuser or request.user is obj.recorder:
                self.inlines = [AbcInline, ]
    
        def get_fields(self, request, obj=None):
            self.set_inlines(request, obj)  # NOTICE this line
            super(XXXAdmin, self).get_fields(request, obj)
    
    0 讨论(0)
提交回复
热议问题