Django Admin: Пользовательское действие массового дублирования некорректно обрабатывает данные формы
Заголовок:
Django Admin: Пользовательское действие массового дублирования некорректно обрабатывает данные формы
Описание:
Я пытаюсь реализовать пользовательское действие в Django Admin для массового дублирования записей для модели. Процесс должен работать следующим образом:
- Выберите несколько записей в Django Admin.
- Нажмите на пользовательское действие под названием "Duplicate selected records in bulk".
- Появится окно, где пользователь может ввести новые даты вступления в силу (начало и конец).
- После нажатия кнопки "Дублировать" создаются новые записи, копирующие все поля исходной записи, за исключением эффективных дат, которые обновляются по мере ввода пользователем, и поля
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 используются правильно.