Как отобразить несколько форм обновления в Django
вот моя проблема.
У меня есть список объектов, который я отображаю в таблице, и все работает отлично, за исключением того, что я хотел бы редактировать их внутри модала и отправлять их с помощью AJAX.
Я думал, что это простая идея - вывести для каждой строки форму с предварительно заполненными входами, а затем отправить выбранную форму с помощью AJAX.
Интересно, есть ли относительно упрощенный способ вывести UpdateForm, не записывая вручную все поля ввода.
Что-то вроде этого:
<table>
{% for transaction in transactions %}
<tr>
<td>{{ transaction.date|date:"d.m.Y" }}</td>
<td>{{ transaction.amount }}</td>
<td>
<a href="#" data-bs-toggle="modal" data-bs-target="#edit{{ transaction.id }}">Edit</a>
<div class="modal" id="edit{{ transaction.id }}">
{{ transaction_form }}
</div>
</td>
<tr>
{% endfor %}
</table>
Но как я могу передать форму из представления?
В настоящее время я делаю это так: когда пользователь нажимает на кнопку edit, страница обновляется и отображается модальная форма с предварительным заполнением, но она (a) медленно открывается и (b) я не думаю, что это хороший способ сделать это.
Это мой текущий код
views.py
class ProjectDetailView(DetailView):
model = Project
template_name = "template.html"
context_object_name = "project"
def get_transactions(self):
transactions = Transaction.objects.filter(project=self.get_object())
return transactions
def get_transaction_form(self):
form = TransactionForm()
if self.request.POST:
form = TransactionForm(self.request.POST)
elif 'edit_entry' in self.request.GET:
form = TransactionForm(instance=self.get_entry())
return form
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['transactions'] = self.get_transactions()
context['transaction_form'] = self.get_transaction_form()
return context
template.html
<table>
{% for transaction in transactions %}
<tr>
<td>{{ transaction.date|date:"d.m.Y" }}</td>
<td>{{ transaction.amount }}</td>
<td>
<a href="{{ project.get_absolute_url }}?edit_entry={{ transaction.slug }}">Edit</a>
</td>
<tr>
{% endfor %}
</table>
<div class="modal" id="edit-modal">
{{ transaction_form }}
</div>
<script>
{% if 'edit_entry' in request.GET %}
$('#edit-modal').modal('show')
{% endif %}
</script>
Спасибо за любые отзывы
Данное решение требует от вас работы с Javascript для этого, когда пользователь нажимает кнопку "Редактировать" для объекта на вашей странице,
- вы посылаете AJAX запрос (используя Fetch API или Jquery) вашему представлению,
- Представление вернет HTML формы, и вы поместите этот HTML в тело модала .
- Покажите модальное окно с кнопкой действия для отправки формы.
- Когда пользователь нажимает кнопку submit, ваш код отправляет форму через Ajax, вы можете использовать Formdata или AjaxForm для этого, представление, которое возвращает JSON или HTML, который указывает, если данные сохранены успешно или нет. .
Проблема в том, что я не специалист по Class-Based View, поэтому не могу дать вам конкретики со стороны Django.