Django Inline: как получить встроенные свойства в change_view () django - PullRequest
0 голосов
/ 12 ноября 2018

Email модель класса

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

Табличная модель Inline.

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

И это моя модель RequestAdmin, которая показывает inlines.

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)

Ошибка изображения, которое я получаю.

Значение исключения:
Тип объекта «EmailInline» не имеет атрибута «body_message»

Теперь, как я могу получить свои встроенные свойства (body_message)?

1 Ответ

0 голосов
/ 12 ноября 2018

Мне кажется, я немного лучше понимаю ваш вопрос - вы хотите воздействовать на реальные объекты, которые заполняются в встроенные формы, и скрывать определенные объекты на основе содержимого свойства 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
...