Hello dear Django experts! I ask for help in this matter: There is a code:

Hello dear Django experts!
I ask for help in this matter:
There is a code:

Blockquote
def get_readonly_fields(self, request, obj=None):

    all_fields = list(self.get_fields(request, obj))
    user_blocked_fields = all_fields[:]
    iskom = 'SELFDISPOSAL'
    naxodim = Articles.objects.filter(delivery_type__title__icontains=iskom)

    if request.user.has_perm('excels.can_edit_manager_group'):
        user_blocked_fields = [f for f in user_blocked_fields if f not in self.manager_group_fields]

    if request.user.has_perm('excels.can_edit_upakovka_group'):
        user_blocked_fields = [f for f in user_blocked_fields if f not in self.upakovka_group_fields]

    if request.user.has_perm('excels.can_edit_transport_group'):
        user_blocked_fields = [f for f in user_blocked_fields if f not in self.transport_group_fields]

    # if request.user.has_perm('excels.can_edit_manager_group') and naxodim:
    #     user_blocked_fields = [f for f in user_blocked_fields if f not in 
    #     self.manager_and_transport_group_fields]
    #
    # if request.user.has_perm('excels.can_edit_transport_group') and naxodim:
    #     user_blocked_fields = [f for f in user_blocked_fields if f not in 
   #      self.transport_minus_all_group_fields]

    return user_blocked_fields

It turns out that I have a change of permissions for editing fields depending on user rights.
further I want to make permission not for the whole table, but only for ONE ROW of the table.
That is, when you enter one record in the table and put the word “SELFDISPOSAL” in FK there, then you write down and then some readonlu_fields change fields to others.
This happens on my filter, but for the whole table (class), and I need ONLY ONE LINE WHERE I HAVE THE SPECIFIED WORD “SELFDISPOSAL” IN ONE OF THE FIELDS.!
How should I do it?
Thanks to everyone who responds!

What’s the type of obj? I think you need to use that when determining naxodim.

День добрый!
тип строка str.
Но я по фильтру нахожу значение которое мне нужно.
Дело в том как это применить только на всего одну запись в таблице, а не на всю таблицу?

Good afternoon!
type string str.
But I use the filter to find the value that I need.
The point is how to apply this to only one record in the table, and not to the whole table?

Are you sure obj is a string? What calls get_readonly_fields()?

I am new to Django and may be wrong about this.
I’ll try to explain what the above function does - it changes all readonly_filds in the table (class) depending on the users’ belonging to a particular group.
There are three groups and for this each group all fields are available for editing, but this applies to the whole class.
I also need to apply my set of fields depending on one field in one of the ForeignKey (naxodim = Articles.objects.filter(delivery_type__title__icontains=iskom)). I also prescribed this condition.

…but apply not to the whole table, but only to one row (record) in the table

Is all of this part of a ModelAdmin class, where this is being used in the Admin?
Or are you using this in a user-created view?

If you’re doing this in the admin, then the obj is the instance of the obj being edited within the admin. Therefore, you can access the fields of that object through the normal “dot notation”.

Yes! I only use admin.py and all tables and actions I have going on there.
May I ask you to decipher for me what you wrote? Detailed example please?

Let’s say you have a model:

class TestModel(models.Model):
    some_field = models.CharField(max_length=100)
...

Then, in your Model Admin class, you want to do something if some_field has the value “DO SOMETHING”, you could write this:

def get_readonly_fields(self, request, obj=None):
    if obj and obj.some_field == "DO SOMETHING":
        # Do whatever you want to do based on this comparison

Now, at this point, I’m going to add in my normal disclaimer - quoting directly from the very first paragraph of the Django docs on the Admin site:

The admin’s recommended use is limited to an organization’s internal management tool. It’s not intended for building your entire front end around.

Depending upon just how much work you’re trying to do through the admin, you may reach a point where you’re creating more work for yourself by trying to add functionality to the admin than you would by creating your own views.

Can you, as an experienced master of your craft and connoisseur of Django, show this with my example?
I can’t figure out what obj will be and how does it differ from my finding the value in the ForeignKey field?
Please excuse me for my misunderstanding!

Obj will be the instance of the object that the user selected for editing in the admin page (probably from the list view). In the case of my example, obj is going to be an instance of TestModel.

For me to answer your question in more detail, I would need to see your admin class and the model classes involved.

When you post code, please insert it between lines containing only 3 backticks - ```. (Make sure you use the backtick - ` and not the apostrophe - '.) That means you would have one line with the 3 backticks, your code, and then one more line with just the 3 backticks. That allows this forum software to format your code nicely:

# The line above this is just ```
def function(parm):
    return parm
# The line after this is just ```

understood you. now send my class from admin.py and models.py

My models.py
“”"
class Articles(models.Model):
history = AuditlogHistoryField()
string_1 = models.CharField(’ ‘, max_length=250,
default=’==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <МЕНЕДЖЕРЫ>=============================’)

id = models.AutoField('Номер заказа', primary_key=True, help_text="поле заполяется автоматически")
actual_project = models.BooleanField('Актуальность заказа', default=True,
                                     help_text="при отсутствии актуальности ЗАКАЗА снимите галочку")

# author = models.ForeignKey(User, on_delete=models.PROTECT, null=True, verbose_name='Имя Менеджера1')
# created_at = models.DateTimeField('Дата создания заказа', auto_now_add=True)
date_created_at = models.DateField('Дата создания заказа', auto_now_add=True,
                                   help_text="поле заполяется автоматически")
time_created_at = models.TimeField('Время создания заказа', auto_now_add=True,
                                   help_text="поле заполяется автоматически")
# modified_at = models.DateTimeField('Дата внесения изменения', auto_now=True)

contragent = models.ForeignKey('Contragent', on_delete=models.PROTECT, verbose_name='Контрагент',
                               default='',
                               # blank=False, null=True,
                               help_text="выбор осуществляется как методом прокрутки так и набором названия")
delivery_address = models.CharField('Адрес поставки', max_length=80,
                                    default='',
                                    # blank=False, null=True
                                    )

region = models.ForeignKey('Region', on_delete=models.PROTECT, verbose_name='Регион',
                               default='',
                               blank=True, null=True,
                               help_text="выбор осуществляется как методом прокрутки так и набором названия")

label = models.ForeignKey('Label', on_delete=models.PROTECT,
                          default='',
                          # blank=False, null=True,
                          verbose_name='Наименование товара',
                          help_text="выбор осуществляется как методом прокрутки так и набором названия")

packing = models.ForeignKey('Packing', on_delete=models.PROTECT,
                            default='',
                            # blank=False, null=True,
                            verbose_name='Фасовка')
quantity = models.IntegerField('Количество, (кг.)',
                               default='',
                               # blank=False, null=True,
                               help_text="ввод осуществляется только цифрами, целое число")
palletizing = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name='Паллетирование',
                                default='',
                                # blank=False, null=True
                                )
output = models.ForeignKey('Put_out', on_delete=models.PROTECT, verbose_name='Выгрузка',
                           default='',
                           # blank=False, null=True
                           )
# output_at = models.DateTimeField('Дата отгрузки', blank=False, null=True,
#                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
date_output_at = models.DateField('Дата отгрузки', null=True,
                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
time_output_at = models.TimeField('Время отгрузки', blank=True, null=True,
                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")

price = models.IntegerField('Целевая цена доставки (руб.)',
                            default='',
                            # blank=False, null=True,
                            help_text="ввод осуществляется только цифрами, целое число")
is_signed = models.ForeignKey('Is_signet', on_delete=models.PROTECT, verbose_name='ДС подписано',
                              default='',
                              # blank=False, null=True
                              )

delivery_type = models.ForeignKey('Delivery_type', on_delete=models.PROTECT, verbose_name='Тип доставки',
                                  default='',
                                  # blank=False, null=True
                                  )

string_2 = models.CharField(' ', max_length=250,
                            default='==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <УПАКОВКА>=============================')

user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Имя Менеджера', blank=True, null=True,
                         help_text="поле заполяется автоматически")
# production_date = models.DateTimeField('Дата производства', blank=True, null=True,
#                                        help_text="ввод можно выбрать из предложенного списка или ввести вручную")
date_production_date = models.DateField('Дата производства', blank=True, null=True,
                                        help_text="ввод можно выбрать из предложенного списка или ввести вручную")
time_production_date = models.TimeField('Время производства', blank=True, null=True,
                                        help_text="ввод можно выбрать из предложенного списка или ввести вручную")

day_night = models.ForeignKey('Day_part', on_delete=models.PROTECT, verbose_name='день / ночь', blank=True,
                              null=True)
product_is_ready = models.ForeignKey('Product_is_ready', on_delete=models.PROTECT,
                                     verbose_name='Готовность продукта',
                                     blank=True,
                                     null=True)
pack_is_ready = models.ForeignKey('Pack_is_ready', on_delete=models.PROTECT, verbose_name='Готовность фасовки',
                                  blank=True,
                                  null=True)

string_3 = models.CharField(' ', max_length=250,
                            default='==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <ТРАНСПОРТ>=============================')

packing_order = models.CharField('Порядок загрузки', max_length=15, default='', blank=True)
# delivery_planed_at = models.DateTimeField('Машина заказана на дату', blank=True, null=True,
#                                           help_text="ввод можно выбрать из предложенного списка или ввести вручную")
date_delivery_planed_at = models.DateField('Машина заказана на дату', blank=True, null=True,
                                           help_text="ввод можно выбрать из предложенного списка или ввести вручную")
time_delivery_planed_at = models.TimeField('Машина заказана на время', blank=True, null=True,
                                           help_text="ввод можно выбрать из предложенного списка или ввести вручную")

# send_at = models.DateTimeField('Дата отправки факт', blank=True, null=True,
#                                help_text="ввод можно выбрать из предложенного списка или ввести вручную")
date_send_at = models.DateField('Дата отправки факт', blank=True, null=True,
                                help_text="ввод можно выбрать из предложенного списка или ввести вручную")
time_send_at = models.TimeField('Время отправки факт', blank=True, null=True,
                                help_text="ввод можно выбрать из предложенного списка или ввести вручную")

transporter = models.CharField('Перевозчик', max_length=35, default='', blank=True)
number_ts = models.CharField('Номер ТС', max_length=15, default='', blank=True)
price_fact = models.IntegerField('Фактическая цена доставки (руб.)', blank=True, null=True,
                                 help_text="ввод осуществляется только цифрами, целое число")
# date_take = models.DateTimeField('Дата доставки', blank=True, null=True,
#                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
date_date_take = models.DateField('Дата доставки', blank=True, null=True,
                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
time_date_take = models.TimeField('Время доставки', blank=True, null=True,
                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")

group = models.ForeignKey(Group, on_delete=models.PROTECT, verbose_name='Имя группы', null=True)

def __str__(self):
    return str(self.contragent)

class Meta:
    verbose_name = '=ТАБЛИЦА ЗАКАЗОВ='
    verbose_name_plural = '=ТАБЛИЦА ЗАКАЗОВ='
    ordering = ['-id']  # порядок сортировки выводимых записей в таблице по дате заведения

    permissions = (
        ('can_edit_manager_group', 'Can edit manager group of columns'),
        ('can_edit_upakovka_group', 'Can edit upakovka group of columns'),
        ('can_edit_transport_group', 'Can edit transport group of columns'),
        # ('can_edit_manager_and_transport_group', 'Can edit manager and transport group of columns'),
        # ('can_edit_transport_minus_all_group', 'Can edit transport minus all group of columns'),
    )

“”"

Please use three single backticks - ``` to enclose your code. Not quotes - " or apostrophe’s - ’

my admin.py:

class ExcelsAdmin(ExportActionModelAdmin):
    save_on_top = True  # выставляет кнопки для сохранения и редактирования в том месте где прописана данная строка
    resource_class = ArticlesResource

    list_display = ['id', 'contragent', 'delivery_address',
                    'region',
                    'label', 'packing',
                    'quantity', 'palletizing', 'output',
                    # 'output_at',
                    'date_output_at',
                    # 'time_output_at',
                    'price', 'is_signed', 'delivery_type',
                    # 'production_date',
                    'date_production_date',
                    # 'time_production_date',
                    'day_night', 'product_is_ready', 'pack_is_ready', 'packing_order',
                    # 'delivery_planed_at',
                    'date_delivery_planed_at',
                    # 'time_delivery_planed_at',
                    # 'send_at',
                    'date_send_at',
                    # 'time_send_at',
                    'transporter', 'number_ts', 'price_fact',
                    # 'date_take',
                    'date_date_take',
                    # 'time_date_take',
                    # 'created_at', 'modified_at',
                    'date_created_at',
                    'time_created_at',
                    'user',
                    'actual_project',
                    ]  # указывает какие поля в строке Заведенных заказов выводить к просмотру
    # exclude = ('contragent',)# убирает из таблицы выбранное поле
    fields = ['string_1', 'actual_project', 'id',
              'date_created_at',
              'time_created_at',
              'user', 'contragent', 'delivery_address', 'region',
              'label', 'packing',
              'quantity', 'palletizing', 'output',
              # 'output_at',
              'date_output_at',
              # 'time_output_at',
              'price', 'is_signed', 'delivery_type', 'string_2',
              # 'production_date',
              'date_production_date',
              # 'time_production_date',
              'day_night', 'product_is_ready', 'pack_is_ready', 'string_3', 'packing_order',
              # 'delivery_planed_at',
              'date_delivery_planed_at',
              # 'time_delivery_planed_at',
              # 'send_at',
              'date_send_at',
              # 'time_send_at',
              'transporter', 'number_ts', 'price_fact',
              # 'date_take',
              'date_date_take',
              # 'time_date_take',
              ]
    readonly_fields = ['actual_project', 'user', 'contragent', 'delivery_address', 'region',
                       'label', 'packing',
                       'quantity', 'palletizing', 'output',
                       'date_created_at',
                       'time_created_at',
                       # 'output_at',
                       'date_output_at',
                       # 'time_output_at',
                       'price', 'is_signed', 'delivery_type',
                       # 'production_date',
                       'date_production_date',
                       # 'time_production_date',
                       'day_night', 'product_is_ready', 'pack_is_ready', 'packing_order',
                       # 'delivery_planed_at',
                       'date_delivery_planed_at',
                       # 'time_delivery_planed_at',
                       # 'send_at',
                       'date_send_at',
                       # 'time_send_at',
                       'transporter', 'number_ts', 'price_fact',
                       # 'date_take'
                       'date_date_take',
                       # 'time_date_take',
                       ]  # данная команда делает ячейки таблицы только для чтения,
    # но работает в паре с командой (fields) потому что без нее ячейки уходят вниз (в конец) под редактируемые ячейки.
    list_display_links = ['id',
                          # 'created_at', 'modified_at',
                          'contragent', 'delivery_address', 'label', 'packing',
                          'quantity', 'palletizing', 'output',
                          # 'output_at',
                          'price', 'is_signed', 'delivery_type',
                          # 'production_date',
                          'day_night', 'product_is_ready', 'pack_is_ready', 'packing_order',
                          # 'delivery_planed_at',
                          # 'send_at',
                          'transporter', 'number_ts', 'price_fact',
                          # 'date_take'
                          ]  # указывает какие поля в строке Заведенных заказов позволяют ссылаться
    # на заказ (заходить в заказ при нажатии на них)
    search_fields = [
        'contragent__title',
        'delivery_address',
        'region__title',
        'label__title',
        'transporter',
        'user__username',
        'number_ts',
    ]  # дает возможность поиска в Админке по заданным в
    # перечне полям, НО РАБОТАЕТ ТОЛЬКО С ТЕКСТОВЫМИ ПОЛЯМИ
    # list_editable = ('n',)  # показывает в каком поле можно вносить правки прямо в таблице
    list_filter = [
        # 'created_at',
        'actual_project',
        ('date_created_at', DateRangeFilter),
        ('date_output_at', DateRangeFilter),
        ('date_production_date', DateRangeFilter),
        ('date_delivery_planed_at', DateRangeFilter),
        ('date_send_at', DateRangeFilter),
        ('date_date_take', DateRangeFilter),
        ('user', RelatedDropdownFilter),
        ('contragent', RelatedDropdownFilter),
        ('region', RelatedDropdownFilter),
        ('delivery_address', DropdownFilter),
        ('label', RelatedDropdownFilter),
        ('packing', RelatedDropdownFilter),
        'palletizing', ]  # показывает по каким полям будет выводиться поле фильтров (справа на экране)

    manager_group_fields = ['actual_project',
                            # 'date_created_at',
                            # 'time_created_at',
                            'contragent', 'delivery_address', 'region',
                            'label', 'packing',
                            'quantity', 'palletizing', 'output',
                            # 'output_at',
                            'date_output_at',
                            # 'time_output_at',
                            'price', 'is_signed', 'delivery_type']
    manager_and_transport_group_fields = ['actual_project',
                                          # 'date_created_at',
                                          # 'time_created_at',
                                          'contragent', 'delivery_address', 'region',
                                          'label', 'packing',
                                          'quantity', 'palletizing', 'output',
                                          # 'output_at',
                                          'date_output_at',
                                          # 'time_output_at',
                                          'price', 'is_signed', 'delivery_type',
                                          'packing_order',
                                          # 'delivery_planed_at',
                                          'date_delivery_planed_at',
                                          # 'time_delivery_planed_at',
                                          # 'send_at',
                                          'date_send_at',
                                          # 'time_send_at',
                                          'transporter', 'number_ts', 'price_fact',
                                          # 'date_take'
                                          'date_date_take',
                                          # 'time_date_take',
                                          ]
    upakovka_group_fields = [
        # 'user',# при налиции данной позиции есть возможность выставить нужного юзера,
        # без данного поля все проставляется автоматически
        # 'production_date',
        'date_production_date',
        # 'time_production_date',
        'day_night', 'product_is_ready', 'pack_is_ready']
    transport_group_fields = ['packing_order',
                              # 'delivery_planed_at',
                              'date_delivery_planed_at',
                              # 'time_delivery_planed_at',
                              # 'send_at',
                              'date_send_at',
                              # 'time_send_at',
                              'transporter', 'number_ts', 'price_fact',
                              # 'date_take'
                              'date_date_take',
                              # 'time_date_take',
                              ]
    transport_minus_all_group_fields = []

    formfield_overrides = {
        models.CharField: {'widget': Textarea(attrs={'size': 5, 'rows': 1, 'cols': 50})},
        models.TextField: {'widget': Textarea(attrs={'rows': 4, 'cols': 40})},
        models.IntegerField: {'widget': Textarea(attrs={'size': 5, 'rows': 1, 'cols': 50})},
        # models.ForeignKey: {'widget': Textarea(attrs={'size': 5, 'rows': 1, 'cols': 50})},
    }

    # ------------------функция у superuser сохраняет строку "Действие" а у users убирает--------------
    def get_actions(self, request):
        actions = super(ExcelsAdmin, self).get_actions(request)
        if not request.user.is_superuser:
            actions = None
        return actions

    # ------------------------------------------------------------------------

    def get_export_filename(self, request, queryset, file_format):  # замена имени экспортированного файла
        file = 'Vigruzka'
        filename = "%s.%s" % (file,
                              file_format.get_extension())
        # filename = filename.encode('utf-8')
        return filename

    # old_file = os.path.join("Users\11\Downloads", "Vigruzka.xlsx")
    # new_file = os.path.join("Users\11\Downloads", "Выгрузка.xlsx")
    # handle = open('config.conf', encoding='utf-8')
    # os.rename(r"с:\Users\11\Downloads\Vigruzka.xlsx", r"с:\Users\11\Downloads\Выгрузка.xlsx")

    # def save_model(self, request, obj, form, change):  # Метод save_model отвечает за автозаполнение поля user.
    # # Несколько несложных условий подставляют необходимый id пользователя.
    #     if form.is_valid():
    #         if not request.user.is_superuser or not form.cleaned_data['user']:
    #             obj.user = request.user
    #             obj.save()
    #         elif form.cleaned_data['user']:
    #             obj.user = form.cleaned_data['user']
    #             obj.save()

    ## ---------------------------------------------------
    # данный вариант оставляет поле user редактируемым для пользователей
    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        if not obj.user:
            obj.user = request.user
            obj.save()

    # --------------------------------
    # эксперимент
    # def get_form(self, request, obj=None, **kwargs):
    #     form = super().get_form(request, obj, **kwargs)
    #     is_superuser = request.user.is_superuser
    #     if not is_superuser:
    #         form.User['user'].disabled = True
    #     return form

    # ------------------------

    def preprocess_list_display(self, request):  # Метод preprocess_list_display добавляет колонку user в список
        # объектов, если его просматривает администратор и удаляет колонку для обычных пользователей.
        # Обратите внимание, что сперва мы проверяем, есть ли запись в list_display и если её нет,
        # то добавляем, а потом уже смотрим кто просматривает список.
        # При создании экземпляра EntryAdmin все его поля становятся глобальными для процесса,
        # поэтому если мы удалим колонку list_display для обычного пользователя и не добавим для
        # администратора, то администратор колонку не увидит. Именно поэтому мы каждый раз её вставляем в список.
        if 'user' not in self.list_display:
            self.list_display.insert(3, 'user')
        if not request.user.is_superuser:
            if 'user' in self.list_display:
                self.list_display.remove('user')  # удаляет столбец юзеров из просмотра юзера
            # if 'group' in self.list_display:
            #     self.list_display.remove('group')  # удаляет столбец группы из просмотра юзера

    def pr(self, request):  # добавляет в конце строки таблицы имя менеджера который создал строку
        # (без возможности его редактирования)
        if 'user' not in self.list_display:
            self.list_display.insert(30, 'user')

    def preprocess_search_fields(self, request):  # Метод preprocess_search_fields делает тоже,
        # что и preprocess_list_display, но только для search_fields. Фактически мы дали возможность
        # администратору не только видеть автора записи, но и осуществлять поиск по его username.
        if 'user__username' not in self.search_fields:
            self.search_fields.insert(self.search_fields.__len__(), 'user__username')
        if not request.user.is_superuser:
            if 'user__username' in self.search_fields:
                self.search_fields.remove('user__username')

    def preprocess_list_filter(self, request):  # убирает фильтр по contragent если пользователь не superuser
        if ('contragent', RelatedDropdownFilter) not in self.list_filter:
            # self.list_filter.insert(self.list_filter.__len__(), ('contragent', RelatedDropdownFilter))
            self.list_filter.insert(2, ('contragent', RelatedDropdownFilter))
        if not request.user.is_superuser:
            if ('contragent', RelatedDropdownFilter) in self.list_filter:
                self.list_filter.remove(('contragent', RelatedDropdownFilter))

        # убирает фильтр по 'user' если пользователь не superuser и в группе managers
        if ('user', RelatedDropdownFilter) not in self.list_filter:
            self.list_filter.insert(1, ('user', RelatedDropdownFilter))
        if not request.user.is_superuser and request.user.has_perm('excels.can_edit_manager_group'):
            if ('user', RelatedDropdownFilter) in self.list_filter:
                self.list_filter.remove(('user', RelatedDropdownFilter))

    def changelist_view(self, request,
                        extra_context=None):  # Три предыдущих метода вызываются из переопределенного changelist_view.
        self.preprocess_list_display(request)
        self.pr(request)
        self.preprocess_search_fields(request)
        self.preprocess_list_filter(request)
        return super(ExcelsAdmin, self).changelist_view(request)

    def get_readonly_fields(self, request, obj=None):

        all_fields = list(self.get_fields(request, obj))
        user_blocked_fields = all_fields[:]
        iskom = 'Самовывоз'
        naxodim = Articles.objects.filter(delivery_type__title__icontains=iskom)

        if request.user.has_perm('excels.can_edit_manager_group'):
            user_blocked_fields = [f for f in user_blocked_fields if f not in self.manager_group_fields]

        if request.user.has_perm('excels.can_edit_upakovka_group'):
            user_blocked_fields = [f for f in user_blocked_fields if f not in self.upakovka_group_fields]

        if request.user.has_perm('excels.can_edit_transport_group'):
            user_blocked_fields = [f for f in user_blocked_fields if f not in self.transport_group_fields]

        # if request.user.has_perm('excels.can_edit_manager_group') and naxodim:
        #     user_blocked_fields = [f for f in user_blocked_fields if f not in self.manager_and_transport_group_fields]
        #
        # if request.user.has_perm('excels.can_edit_transport_group'):
        #     user_blocked_fields = [f for f in user_blocked_fields if f not in self.transport_minus_all_group_fields]

        return user_blocked_fields

def get_queryset(self, request):
        base_qs = super().get_queryset(request)
        if request.user.has_perm('excels.can_edit_manager_group') and not (
                request.user.has_perm('excels.can_edit_upakovka_group') or request.user.has_perm
            ('excels.can_edit_transport_group')):
            return base_qs.filter(user=request.user)
        return base_qs

Soryy!

class Articles(models.Model):
    history = AuditlogHistoryField()
    string_1 = models.CharField(' ', max_length=250,
                                default='==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <МЕНЕДЖЕРЫ>=============================')

    id = models.AutoField('Номер заказа', primary_key=True, help_text="поле заполяется автоматически")
    actual_project = models.BooleanField('Актуальность заказа', default=True,
                                         help_text="при отсутствии актуальности ЗАКАЗА снимите галочку")

    # author = models.ForeignKey(User, on_delete=models.PROTECT, null=True, verbose_name='Имя Менеджера1')
    # created_at = models.DateTimeField('Дата создания заказа', auto_now_add=True)
    date_created_at = models.DateField('Дата создания заказа', auto_now_add=True,
                                       help_text="поле заполяется автоматически")
    time_created_at = models.TimeField('Время создания заказа', auto_now_add=True,
                                       help_text="поле заполяется автоматически")
    # modified_at = models.DateTimeField('Дата внесения изменения', auto_now=True)

    contragent = models.ForeignKey('Contragent', on_delete=models.PROTECT, verbose_name='Контрагент',
                                   default='',
                                   # blank=False, null=True,
                                   help_text="выбор осуществляется как методом прокрутки так и набором названия")
    delivery_address = models.CharField('Адрес поставки', max_length=80,
                                        default='',
                                        # blank=False, null=True
                                        )

    region = models.ForeignKey('Region', on_delete=models.PROTECT, verbose_name='Регион',
                                   default='',
                                   blank=True, null=True,
                                   help_text="выбор осуществляется как методом прокрутки так и набором названия")

    label = models.ForeignKey('Label', on_delete=models.PROTECT,
                              default='',
                              # blank=False, null=True,
                              verbose_name='Наименование товара',
                              help_text="выбор осуществляется как методом прокрутки так и набором названия")

    packing = models.ForeignKey('Packing', on_delete=models.PROTECT,
                                default='',
                                # blank=False, null=True,
                                verbose_name='Фасовка')
    quantity = models.IntegerField('Количество, (кг.)',
                                   default='',
                                   # blank=False, null=True,
                                   help_text="ввод осуществляется только цифрами, целое число")
    palletizing = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name='Паллетирование',
                                    default='',
                                    # blank=False, null=True
                                    )
    output = models.ForeignKey('Put_out', on_delete=models.PROTECT, verbose_name='Выгрузка',
                               default='',
                               # blank=False, null=True
                               )
    # output_at = models.DateTimeField('Дата отгрузки', blank=False, null=True,
    #                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    date_output_at = models.DateField('Дата отгрузки', null=True,
                                      help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    time_output_at = models.TimeField('Время отгрузки', blank=True, null=True,
                                      help_text="ввод можно выбрать из предложенного списка или ввести вручную")

    price = models.IntegerField('Целевая цена доставки (руб.)',
                                default='',
                                # blank=False, null=True,
                                help_text="ввод осуществляется только цифрами, целое число")
    is_signed = models.ForeignKey('Is_signet', on_delete=models.PROTECT, verbose_name='ДС подписано',
                                  default='',
                                  # blank=False, null=True
                                  )

    delivery_type = models.ForeignKey('Delivery_type', on_delete=models.PROTECT, verbose_name='Тип доставки',
                                      default='',
                                      # blank=False, null=True
                                      )

    string_2 = models.CharField(' ', max_length=250,
                                default='==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <УПАКОВКА>=============================')

    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Имя Менеджера', blank=True, null=True,
                             help_text="поле заполяется автоматически")
    # production_date = models.DateTimeField('Дата производства', blank=True, null=True,
    #                                        help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    date_production_date = models.DateField('Дата производства', blank=True, null=True,
                                            help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    time_production_date = models.TimeField('Время производства', blank=True, null=True,
                                            help_text="ввод можно выбрать из предложенного списка или ввести вручную")

    day_night = models.ForeignKey('Day_part', on_delete=models.PROTECT, verbose_name='день / ночь', blank=True,
                                  null=True)
    product_is_ready = models.ForeignKey('Product_is_ready', on_delete=models.PROTECT,
                                         verbose_name='Готовность продукта',
                                         blank=True,
                                         null=True)
    pack_is_ready = models.ForeignKey('Pack_is_ready', on_delete=models.PROTECT, verbose_name='Готовность фасовки',
                                      blank=True,
                                      null=True)

    string_3 = models.CharField(' ', max_length=250,
                                default='==========================ЯЧЕЙКИ ДЛЯ ЗАПОЛНЕНИЯ ГРУППОЙ <ТРАНСПОРТ>=============================')

    packing_order = models.CharField('Порядок загрузки', max_length=15, default='', blank=True)
    # delivery_planed_at = models.DateTimeField('Машина заказана на дату', blank=True, null=True,
    #                                           help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    date_delivery_planed_at = models.DateField('Машина заказана на дату', blank=True, null=True,
                                               help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    time_delivery_planed_at = models.TimeField('Машина заказана на время', blank=True, null=True,
                                               help_text="ввод можно выбрать из предложенного списка или ввести вручную")

    # send_at = models.DateTimeField('Дата отправки факт', blank=True, null=True,
    #                                help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    date_send_at = models.DateField('Дата отправки факт', blank=True, null=True,
                                    help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    time_send_at = models.TimeField('Время отправки факт', blank=True, null=True,
                                    help_text="ввод можно выбрать из предложенного списка или ввести вручную")

    transporter = models.CharField('Перевозчик', max_length=35, default='', blank=True)
    number_ts = models.CharField('Номер ТС', max_length=15, default='', blank=True)
    price_fact = models.IntegerField('Фактическая цена доставки (руб.)', blank=True, null=True,
                                     help_text="ввод осуществляется только цифрами, целое число")
    # date_take = models.DateTimeField('Дата доставки', blank=True, null=True,
    #                                  help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    date_date_take = models.DateField('Дата доставки', blank=True, null=True,
                                      help_text="ввод можно выбрать из предложенного списка или ввести вручную")
    time_date_take = models.TimeField('Время доставки', blank=True, null=True,
                                      help_text="ввод можно выбрать из предложенного списка или ввести вручную")

    group = models.ForeignKey(Group, on_delete=models.PROTECT, verbose_name='Имя группы', null=True)

    def __str__(self):
        return str(self.contragent)

    class Meta:
        verbose_name = '=ТАБЛИЦА ЗАКАЗОВ='
        verbose_name_plural = '=ТАБЛИЦА ЗАКАЗОВ='
        ordering = ['-id']  # порядок сортировки выводимых записей в таблице по дате заведения

        permissions = (
            ('can_edit_manager_group', 'Can edit manager group of columns'),
            ('can_edit_upakovka_group', 'Can edit upakovka group of columns'),
            ('can_edit_transport_group', 'Can edit transport group of columns'),
            # ('can_edit_manager_and_transport_group', 'Can edit manager and transport group of columns'),
            # ('can_edit_transport_minus_all_group', 'Can edit transport minus all group of columns'),
        )


I am very worried, because I promised to help a friend in his program, but I can’t do it for a long time …

This line is doing you no good at all - you’re getting references to completely different instances of Articles than the one being edited. The obj that you’re being passed as a parameter is the instance of Articles you want to use.

So, let’s take a step back to the basics for a moment. If you have an instance of Articles named an_article, how would you access the title field through the delivery_type foreign key?

Fuh! I even sweated and felt like 25 years ago on an exam in front of a formidable teacher. :sweat:
Probably need to dive into Django ORM?
I would like to answer you quickly, but I’m afraid I can’t … :worried: