Код используется для отображения входных полей на основе различных типов расходов в форму редактирования < /p>
// Clear previous fields
dynamicFieldsContainer.innerHTML = '';
// Inject fields dynamically
for (const [key, value] of Object.entries(data.fields)) {
// Skip fields that are null or undefined
if (value === null || value === undefined) continue;
const field = `
${key.replace('_', ' ').toUpperCase()}
`;
dynamicFieldsContainer.insertAdjacentHTML('beforeend', field);
}
< /code>
Это скрытые поля, которые уже присутствуют в форме и заполнены сценарием JS, являются единственными полями, присутствующими в запросе Post < /p>
// Set hidden ID field
document.getElementById('expense-id').value = data.id;
// Set hidden expense-type field
document.getElementById('expense-type').value = data.type;
< /code>
Текущая HTML -структура, которая показывает форму и действие POST, а также скрытые и динамически рендеринг HTML -тегов < /p>
{% csrf_token %}
Edit Expense
Cancel
Save Changes
< /code>
Скрипт на стороне клиента, используемый для обновления записи в db < /p>
// Handle form submission
const form = document.getElementById('editExpenseForm');
form.addEventListener('submit', function (event) {
event.preventDefault();
const formData = new FormData(form);
// Debug: Log form data
for (let [key, value] of formData.entries()) {
console.log(`${key}: ${value}`);
}
fetch(form.action, {
method: 'POST',
body: formData,
})
.then(response => response.json())
.then(data => {
if (data.success) {
bootstrap.Modal.getInstance(editModal).hide();
const confirmationModal = new bootstrap.Modal(document.getElementById('confirmationModal'));
confirmationModal.show();
setTimeout(() => confirmationModal.hide(), 1500);
} else {
alert('Error updating expense: ' + data.error);
}
< /code>
Скрипт бэкэнд, используемый для обновления DB, однако, request.post показывает только три поля, которые представляют собой скрытые входы, показанные выше в коде HTML, а также токен CSRF, но ни один из других полей показаны при подаче запроса отправки < /p>
@login_required
def update_expense(request):
if request.method == 'POST':
expense_id = request.POST.get('expense-id')
expense_type = request.POST.get('expense-type')
expense_model = {
'Driver Salary': DriverSalary,
'Vehicle Repair': VehicleRepair,
'Mileage': Mileage,
'Other Expense': OtherExpense,
'Vehicle Tracker': VehicleTracker,
}.get(expense_type)
expense = get_object_or_404(expense_model, id=expense_id)
print(request.body)
for field in expense._meta.get_fields():
if field.concrete and field.name in request.POST:
setattr(expense, field.name, request.POST.get(field.name))
expense.save()
return JsonResponse({'success': True})
return JsonResponse({'error': 'Invalid request'}, status=400)
Подробнее здесь: https://stackoverflow.com/questions/793 ... st-request