Django2: после отправки формы есть лучший способ «стереть» POST, чтобы остановить повторную отправку - PullRequest
0 голосов
/ 28 августа 2018

У меня есть приложение django, и на одной странице у меня есть несколько форм для разных моделей. Я хотел бы получить сообщение об успехе, которое легко сделать, просто добавив в контекст после отправки / проверки формы. Тем не менее, это оставляет возможность повторной отправки формы, которая просто выдаст ошибку на страницу, но это все равно раздражает.

URLs:

 url_patterns = [
      re_path(r'^manager/$', Manager.as_view(), name='manager'),

      .......more.....
 ]

views.py:

class Manager(LoginRequiredMixin, View):

    template_name = 'results/manager_templates/manager.html'
    form1 = Form1
    form2 = Form2

    login_url = '/'
    redirect_field_name = 'redirect_to'


    def get(self, request, *args, **kwargs):

        form1 = self.form1()
        form2 = self.form2()

        context = {
                'form1': form1,
                'form2': form,}

        return render(request, self.template_name, context)


    def post(self, request, *args, **kwargs):

        submit_clicked = request.POST.get('submit')

        form1 = self.form1()
        form2 = self.form2()

        context = {}

        if submit_clicked == 'Form 1':

            form1 = self.form1(request.POST)

            if form1.is_valid():
                form1.save()

                context['message'] = 'Form 1 successful'

                # reset the form
                form1 = self.form1()

                # return HttpResponseRedirect(
                #            reverse('results:manager',
                #        ))


            else:
                print('NOT VALID')


        elif submit_clicked == 'Form 2':

             ... do same stuff as above ...


        context['form1'] = form1
        context['form2'] = form2

        return render(request, self.template_name, context)

Если бы я раскомментировал HttpResponseRedirect, после того, как форма была проверена и добавлена ​​следующим образом:

               return HttpResponseRedirect(
                           reverse('results:manager',
                      ))

Затем он возвращает меня на мою страницу, и, если я обновлю форму, она не будет повторно отправлена. Однако я не могу передать этот аргумент без прохождения через URL:

т.е. если бы я написал:

               return HttpResponseRedirect(
                           reverse('results:manager',
                           kwargs={'success':'success'}
                      ))

Я получаю ошибку:

Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 1 pattern(s) tried: ['manager/$']

и если я изменю urls.py на:

 url_patterns = [
        re_path(r'^manager/$', Manager.as_view(), name='manager'),
        re_path(r'^manager/(?P<success>)$', Manager.as_view(), name='manager'),

 ] 

Я получаю ошибку:

 Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 2 pattern(s) tried: ['manager/(?P<success>)$', 'manager/$']

Есть ли способ передать переменные HttpResponseRedirect, которые не нужно добавлять в регулярное выражение url? Или есть какой-либо другой способ «сбросить» мой запрос. POST, чтобы формы не отправлялись повторно без использования HttpResponseRedirect?

1 Ответ

0 голосов
/ 28 августа 2018

Как вы обнаружили, вы должны перенаправить после успешной публикации, чтобы предотвратить повторяющиеся запросы.

Когда вы изменили URL-адреса, в вашей группе success не было добавлено ни одного соответствующего символа.

re_path(r'^manager/(?P<success>\w+)$', Manager.as_view(), name='manager'),

Другой вариант - сохранить переменную в строке запроса, например, /manager/?success=success, затем вы можете получить значение из request.GET после перенаправления.

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

...