Django - заполнение формы редактирования/обновления предварительно существующими данными объекта

У меня есть форма редактирования/обновления значений в Django, в которой вам нужно выбрать объект, детали которого вы хотите изменить, из выпадающего меню, а затем ввести новую информацию, которую вы хотите изменить/обновить. Когда вы выбираете объект из выпадающего меню, форма выглядит следующим образом: enter image description here

Я пытаюсь заполнить форму редактирования предварительно существующими полями объекта, который я выбрал из выпадающего меню, чтобы было легче вносить изменения. это должно выглядеть как на этом скриншоте:

enter image description here

Есть идеи, как я могу этого добиться?

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)

Вот в чем проблема.

Вы загружаете страницу и выводите форму. Затем вы выбираете объект, представляющий строку данных, которыми будет заполнена форма. В этот момент форма уже отрисована.

У вас есть два варианта:

  1. Перестройте рабочий процесс так, чтобы поле выбора и форма редактирования находились на отдельных загружаемых страницах. Вы загружаете выпадающее поле, выбираете объект и отправляете форму, которая затем повторно загружает форму (200 при POST или перенаправлении) с заполненными данными

    .
  2. Обработка данных с помощью JavaScript на стороне клиента. Вам нужно будет следить за выпадающим полем и затем заполнять форму данными с помощью JavaScript.

    .

    A. Вы можете либо передать ВСЕ данные для всех вариантов выбора в JavaScript при начальной загрузке страницы, что может быть очень много для большой таблицы, либо...

    .

    B. Вы можете получить данные через API при изменении выпадающего списка.

    .

Я бы отдал предпочтение первому варианту. Представьте пользователю выпадающий список и кнопку "Далее" (/edit/). Использовать данные формы для перенаправления на страницу с формой редактирования и кнопкой сохранения (/edit/<id>/). Используйте данные формы для обновления объекта и перенаправления обратно на страницу с выпадающей формой (/edit/).

Вернуться на верх