Возврат нового FormWizard с данными из текущего FormWizard - PullRequest
0 голосов
/ 02 июня 2018

В настоящее время у меня есть основной FormWizard, использующий производные формы ModelForm для своих шагов.Когда пользователь закончил, он сохраняет в базу данных.Вместо того, чтобы перенаправлять их обратно в пустой FormWizard, я хотел бы отобразить новый экземпляр FormWizard, начиная с первого шага, но предварительно заполнив определенные поля информацией, которую они вводили в исходной форме.

Ниже приведена базовая функциональность:

class CustomWizardView(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'uploads'))

    instance = None

    def get_form_instance(self, step):
        if not self.instance:
            self.instance = Post()
        return self.instance

    def done(self, form_list, **kwargs):
        self.instance.user = self.request.user
        self.instance.save()
        return HttpResponseRedirect('/session-form')

И вот как я это сделал, прежде чем понял, насколько большой должна быть моя форма, и что для нее требуется FormWizard:

class PostFormView(TemplateView):
    template_name = 'form/form.html'

    def get(self, request):
        form = TestPostForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = TestPostForm(request.POST, request.FILES)

        building_floor_data = 0
        department_data = ''

        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            building_floor_data = form.cleaned_data['building_floor']
            department_data = form.cleaned_data['department']
            post.save()
            # return redirect('form')

        form = TestPostForm()

        form.fields['building_floor'].initial = building_floor_data
        form.fields['department'].initial = department_data

        return render(request, self.template_name, {'form': form})

Я очень новичок в Django, так что это может быть очень очевидным прыжком.Я просто не понимаю.

1 Ответ

0 голосов
/ 11 июня 2018

Закончилось выяснить это.Вы должны перезаписать функцию get_form_initial в SessionWizardView.Вы ищете для создания словаря, начальный dict, внутри должны быть пары ключ-значение имени поля и желаемого значения.Для меня способ получения значения заключался в получении последнего введенного пользователем значения в базе данных с использованием отфильтрованного запроса.Пример ниже:

def get_form_initial(self, step):
    initial = {}
    user = self.request.user.username
    if step == '0':
        main_db_query = Post.objects.filter(user__username__exact=user).last()
        if main_db_query:
            initial = {'site': main_db_query.site,
                       'floor': main_db_query.floor,
                       'room_number': main_db_query.room_number,
                       'department': main_db_query.department}
    return self.initial_dict.get(step, initial)
...