Django Admin: Пользовательское действие массового дублирования некорректно обрабатывает данные формы

Заголовок:

Django Admin: Пользовательское действие массового дублирования некорректно обрабатывает данные формы

Описание:

Я пытаюсь реализовать пользовательское действие в Django Admin для массового дублирования записей для модели. Процесс должен работать следующим образом:

  1. Выберите несколько записей в Django Admin.
  2. Нажмите на пользовательское действие под названием "Duplicate selected records in bulk".
  3. Появится окно, где пользователь может ввести новые даты вступления в силу (начало и конец).
  4. После нажатия кнопки "Дублировать" создаются новые записи, копирующие все поля исходной записи, за исключением эффективных дат, которые обновляются по мере ввода пользователем, и поля liberado, которое должно быть установлено в значение False.

Проблема, с которой я столкнулся, заключается в том, что когда я отправляю форму с новыми датами, представление дублирования, похоже, не обрабатывает отправленные данные. Метод POST срабатывает неправильно, и данные формы не перехватываются.

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

Вот соответствующая структура кода:

Модель и форма:

class OrcamentoOpicional(models.Model):
    nome = models.CharField(max_length=100)
    categoria = models.ForeignKey(CategoriaOpcionais, on_delete=models.DO_NOTHING, null=True, blank=True)
    sub_categoria = models.ForeignKey(SubcategoriaOpcionais, on_delete=models.DO_NOTHING, null=True, blank=True)
    descricao = models.TextField()
    valor = models.DecimalField(decimal_places=2, max_digits=5, default=0.00)
    valor_final = models.DecimalField(decimal_places=2, max_digits=5, default=0.00, editable=False)
    inicio_vigencia = models.DateField()
    final_vigencia = models.DateField()
    liberado = models.BooleanField(default=False)

class DuplicarEmMassaForm(forms.Form):
    data_inicio = forms.DateField(label="Start Date", widget=forms.DateInput(attrs={'type': 'date'}))
    data_fim = forms.DateField(label="End Date", widget=forms.DateInput(attrs={'type': 'date'}))

Пользовательский класс администратора с действием массового дублирования:

class DuplicarEmMassaAdmin(admin.ModelAdmin):
    actions = ['duplicar_em_massa']

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('duplicar-em-massa/', self.admin_site.admin_view(self.duplicar_em_massa), name='duplicar_em_massa'),
        ]
        return custom_urls + urls

    def duplicar_em_massa(self, request, queryset):
        if request.method == 'POST':
            form = DuplicarEmMassaForm(request.POST)
            if form.is_valid():
                data_inicio = form.cleaned_data['data_inicio']
                data_fim = form.cleaned_data['data_fim']

                for item in queryset:
                    item.pk = None  # This sets the PK to None, creating a new record on save
                    item.inicio_vigencia = data_inicio
                    item.final_vigencia = data_fim
                    item.liberado = False
                    item.save()

                self.message_user(request, f"{queryset.count()} records duplicated successfully!")
                return redirect(request.get_full_path())
        else:
            form = DuplicarEmMassaForm()

        return render(request, 'admin/duplicar_em_massa.html', context={
            'items': queryset,
            'form': form,
            'title': "Duplicate records in bulk",
        })

Шаблон HTML:

{% extends "admin/base_site.html" %}

{% block content %}
<h1>{{ title }}</h1>
<p>Confirm the new effective dates to duplicate the selected records.</p>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="hidden" name="aplicar" value="1">
    <button type="submit" class="button">Duplicate</button>
</form>
{% endblock %}

Выпуск:

  • Когда я отправляю форму, запрос POST не обрабатывается правильно представлением duplicar_em_massa. Форма отображается корректно, но при отправке Django не перехватывает и не обрабатывает данные запроса.
  • Я пробовал отлаживать с помощью операторов print, но блок, который должен обрабатывать запрос POST, не выполняется после отправки формы.

Вопрос:

  • Почему Django Admin не обрабатывает запрос POST правильно в моем пользовательском действии массового дублирования? Что я могу делать неправильно при настройке этой функциональности массового дублирования?

Буду признателен за любые соображения о том, что может быть причиной этой проблемы и как ее решить. Спасибо!

  • Проверили шаблон и структуру формы.
  • Убедился, что форма включает csrf_token.
  • Добавил операторы print для отладки, но я вижу, что код выполняется только при загрузке страницы, а не при отправке формы.
  • Проверил, что форма отправляется через POST и что методы HTTP используются правильно.
Вернуться на верх