Как добавить начальные значения (initial) для полей формы в админке Django?

Как можно реализовать сохранение данных и переход на новую форму для создания записи в Django админке при нажатии на кнопку "Сохранить и добавить еще", где уже будут заполнены поля с предыдущей модели? 

Вот пример моего кода:

```python
@admin.register(models.Location)
class LocationAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'color', 'priority')
    list_per_page = 25
    search_fields = ('name', 'color', 'priority')

    def save_model(self, request: HttpRequest, obj, form, change) -> None:
        if form.data.get('_addanother') == 'Сохранить и добавить еще':
            ModelForm = form.__class__
            form = ModelForm(initial=obj.__dict__)
            super().save_model(request, obj, form, change)
        else:
            super().save_model(request, obj, form, change)
```

Как можно изменить код, чтобы при нажатии на кнопку "Сохранить и добавить еще" данные сохранялись, а затем происходил переход на новую форму для создания записи со заполненными полями из предыдущей модели?
Изображение к вопросу
  • 4 октября 2023 г. 13:07
Ответы на вопрос 2
Для добавления начальных значений для полей формы в админке Django можно использовать атрибут `default` модели. Например, если у вас есть модель `Location` с полем `name` и вы хотите задать начальное значение для него, вы можете изменить вашу модель следующим образом:

```python
from django.db import models

class Location(models.Model):
    name = models.CharField(max_length=100, default='Начальное значение')
    # остальные поля модели
```

Теперь поле `name` будет иметь начальное значение 'Начальное значение' при создании новой записи.

Чтобы реализовать сохранение данных и переход на новую форму для создания записи в Django админке при нажатии на кнопку "Сохранить и добавить еще", вы можете использовать метод `response_add()` административного класса.

```python
from django.contrib import admin
from django.http import HttpResponseRedirect

@admin.register(models.Location)
class LocationAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'color', 'priority')
    list_per_page = 25
    search_fields = ('name', 'color', 'priority')

    def response_add(self, request, obj, post_url_continue=None):
        if '_addanother' in request.POST:
            return HttpResponseRedirect('/admin/myapp/location/add/')
        else:
            return super().response_add(request, obj, post_url_continue)
```

В этом примере, если пользователь нажимает кнопку "Сохранить и добавить еще", он будет перенаправлен на URL для создания новой записи, а если он нажимает "Сохранить", будет использоваться стандартный метод `response_add()`.

Обратите внимание, что вы должны изменить `'myapp'` и `'location'` в URL-адресе перенаправления под свои модели и их приложения.
def get_form(self, request, obj=None, **kwargs):
    form = super(<>, self).get_form(request, obj, **kwargs)
    # В этом методе можно вносить изменения в форму, как обычно...
    # Например, если есть параметр 'product_id' в GET-запросе, то можно установить начальное значение поля 'delivery_add' равным адресу пользователя
    if request.GET and request.GET['product_id']:
        product_id = request.GET['product_id']
        product = Product.objects.get(id=product_id)
        form.base_fields['delivery_add'].initial = request.user.address
    return form
Похожие вопросы