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