代码之家  ›  专栏  ›  技术社区  ›  Muhammad Faizan Fareed

Django内联:如何在change_view()Django中获取内联属性

  •  0
  • Muhammad Faizan Fareed  · 技术社区  · 7 年前

    电子邮件模型类

     class Email(models.Model)
           body_message = models.TextField(max_length = 256, null = False)
           #other fields ForeignKey, subject, to etc.
    

    表格内联模型。

    #Inline Email
    class EmailInline(admin.TabularInline):
    model = Email
    

    class RequestAdmin(admin.ModelAdmin):
          inlines = [EmailInline,]
    
          #In change_view() i want to print my inlines properties 
    
          def change_view(self, request, object_id, form_url='', extra_context=None):
                    
                    for inline in self.inlines:
                          #Here i can remove my specific inline
                          self.inlines.remove(inline)
                          #But i want to check my inline_class properties
                          print(inline.body_message) #This line raise exception
                          #i want to print inlines body_message
                          
    
          return super(RequestAdmin, self).change_view(request, object_id)
    

    我得到的错误图像。

    Exception Value:
    type object 'EmailInline' has no attribute 'body_message'

    现在我如何获得内联属性(body\u消息)?

    1 回复  |  直到 6 年前
        1
  •  4
  •   YellowShark    7 年前

    我想我对你的问题理解得更清楚一些——你想影响正在填充到内联表单中的实际对象,并根据表单的内容隐藏某些对象 body_message 财产。在这种情况下,您可以覆盖 InlineModelAdmin.get_queryset ModelAdmin.get_inline_formsets 方法,它使您有机会更改将为内联对象生成的表单:

    from django.contrib.admin.options import TabularInline
    
    class EmailInline(TabularInline):
        model = Email
    
        # If you want to manipulate the query used to select the related objects:
        def get_queryset(self, request):
            queryset = super(EmailInline, self).get_queryset(request)
            modified_queryset = queryset.exclude(body_message__contains='some string')
            return modified_queryset
    
    
    class RequestAdmin(admin.ModelAdmin):
        inlines = [EmailInline, ]
    
        # If you wanted to manipulate the inline forms, to make one of the fields read-only:
        def get_inline_formsets(self, request, formsets, inline_instances, obj=None):
            inline_admin_formsets = []
            for inline, formset in zip(inline_instances, formsets):
                fieldsets = list(inline.get_fieldsets(request, obj))
                readonly = list(inline.get_readonly_fields(request, obj))
                prepopulated = dict(inline.get_prepopulated_fields(request, obj))
                inline_admin_formset = helpers.InlineAdminFormSet(
                    inline, formset, fieldsets, prepopulated, readonly,
                    model_admin=self,
                )
    
                # Custom code here - analyze the forms/objects, make changes to the form if desired:
                if isinstance(inline, EmailInline):
                    for form in inline_admin_formset.forms:
                        if 'some string' in form.instance.body_message:
                            # this adds the "readonly" attribute to the input widget for the `body_message` field:
                            form.fields['body_message'].widget.attrs['readonly'] = True
    
                inline_admin_formsets.append(inline_admin_formset)
            return inline_admin_formsets
    
    推荐文章