Django - заполнение формы редактирования/обновления предварительно существующими данными объекта
У меня есть форма редактирования/обновления значений в Django, в которой вам нужно выбрать объект, детали которого вы хотите изменить, из выпадающего меню, а затем ввести новую информацию, которую вы хотите изменить/обновить.
Когда вы выбираете объект из выпадающего меню, форма выглядит следующим образом:
Я пытаюсь заполнить форму редактирования предварительно существующими полями объекта, который я выбрал из выпадающего меню, чтобы было легче вносить изменения. это должно выглядеть как на этом скриншоте:
Есть идеи, как я могу этого добиться?
Views.py Код:
def tasks(request):
if request.user.is_superuser:
context = {
'tasks':Task.objects.all(),
'title': 'Tasks',
'addForm':AddNewTask(prefix = 'add'),
'editForm':EditTask(prefix = 'edit'),
}
else:
context = {
'tasks':Task.objects.filter(created_by=request.user),
'title': 'Tasks',
'addForm':AddNewTask(prefix = 'add'),
'editForm':EditTask(prefix = 'edit'),
}
if request.method =='POST':
if 'addNew'in request.POST:
addForm = AddNewTask(request.POST,prefix = 'add')
if addForm.is_valid():
task = addForm.save(commit=False)
task.created_by = request.user
task.save()
messages.success(request, f' Task Created Successfully ')
else:
messages.warning(request, 'Something Went Wrong !')
elif 'editExisting' in request.POST:
editForm = EditTask(request.POST,prefix = 'edit')
if editForm.is_valid():
taskID = editForm.cleaned_data['existing_task'].id
new_title = editForm.cleaned_data['title']
new_desc = editForm.cleaned_data['description']
new_status = editForm.cleaned_data['status']
object = Task.objects.get(id=taskID)
object.title = new_title
object.description = new_desc
object.status = new_status
object.save()
messages.success(request, f'Task #{taskID} Has Been Edited Successfully!')
else:
messages.warning(request, 'Something Went Wrong !')
return render(request,'ticketing/tasks.html',context)
forms.py Код:
class EditTask(forms.Form):
existing_task = forms.ModelChoiceField(Task.objects.order_by('id'),label= 'Existing Task')
title = forms.CharField(max_length=100,required=True,label ='Title')
description = forms.CharField(widget=forms.Textarea,label='Description')
status = forms.ChoiceField(choices=Status,label='Change Status')
models.py Код:
class Task(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
description = models.TextField()
last_modified = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User,on_delete=models.PROTECT)
status = models.CharField(choices=Status,max_length=2,default='O')
def __str__(self):
return str(self.title)
Вот в чем проблема.
Вы загружаете страницу и выводите форму. Затем вы выбираете объект, представляющий строку данных, которыми будет заполнена форма. В этот момент форма уже отрисована.
У вас есть два варианта:
Перестройте рабочий процесс так, чтобы поле выбора и форма редактирования находились на отдельных загружаемых страницах. Вы загружаете выпадающее поле, выбираете объект и отправляете форму, которая затем повторно загружает форму (200 при POST или перенаправлении) с заполненными данными
.Обработка данных с помощью JavaScript на стороне клиента. Вам нужно будет следить за выпадающим полем и затем заполнять форму данными с помощью JavaScript.
.A. Вы можете либо передать ВСЕ данные для всех вариантов выбора в JavaScript при начальной загрузке страницы, что может быть очень много для большой таблицы, либо...
.B. Вы можете получить данные через API при изменении выпадающего списка.
.
Я бы отдал предпочтение первому варианту. Представьте пользователю выпадающий список и кнопку "Далее" (/edit/). Использовать данные формы для перенаправления на страницу с формой редактирования и кнопкой сохранения (/edit/<id>/). Используйте данные формы для обновления объекта и перенаправления обратно на страницу с выпадающей формой (/edit/).