Как создать динамическое поле для админ формы?

Для создания динамического поля в админской форме Django, вам понадобится настроить административную модель и создать свой класс формы.

Вот шаги, которые вам потребуются для создания динамического поля:

Шаг 1: Определить модель
Сначала вам нужно определить модель, для которой вы хотите создать динамическое поле. Давайте представим, что у нас есть модель "Task", с полями "название" и "описание":

from django.db import models

class Task(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

Шаг 2: Создать админ модель
Затем вам нужно создать админскую модель, которая связывает вашу модель с формой администратора. Создайте файл admin.py и добавьте следующий код:

from django.contrib import admin
from .models import Task

class TaskAdmin(admin.ModelAdmin):
    pass

admin.site.register(Task, TaskAdmin)

Теперь, когда вы зарегистрировали вашу модель в админе, вы сможете управлять ею через административный интерфейс Django.

Шаг 3: Создайте класс формы
Теперь вам нужно создать класс формы, чтобы определить динамическое поле. В файле admin.py добавьте следующий код:

from django import forms
from .models import Task, DynamicField

class TaskAdminForm(forms.ModelForm):
    dynamic_field = forms.CharField(max_length=100)

    class Meta:
        model = Task
        fields = '__all__'

class TaskAdmin(admin.ModelAdmin):
    form = TaskAdminForm

admin.site.register(Task, TaskAdmin)

В этом коде мы создали новый класс формы TaskAdminForm, который наследуется от ModelForm. Затем мы добавили новое поле dynamic_field с помощью CharField.

В классе TaskAdmin указываем созданный форм-класс как значение атрибута form. Теперь, когда вы зайдете в админку Django и откроете форму редактирования вашей модели Task, вы увидите новое динамическое поле "dynamic_field".

Шаг 4: Обработка данных из динамического поля
Для обработки данных из вашего динамического поля, вы можете переопределить метод save_model в вашем классе модели, как показано ниже:

class TaskAdmin(admin.ModelAdmin):
    form = TaskAdminForm

    def save_model(self, request, obj, form, change):
        dynamic_field_value = form.cleaned_data['dynamic_field']
        # Дополнительная логика обработки dynamic_field_value
        # ...
        super().save_model(request, obj, form, change)

admin.site.register(Task, TaskAdmin)

В методе save_model вы можете получить значение dynamic_field с помощью form.cleaned_data и выполнять дополнительную логику, основанную на этом значении, если это необходимо.