Как перенаправить на URL с помощью кнопки отмены в django-crispy-форм?

class StudentCreateView(CreateView):
    model = Student
    template_name = "students/students_edit.html"
    form_class = StudentCreateForm

def get_success_url(self):
    return u'%s?status_message=Студент успішно створений' % reverse('home')

def post(self, request, *arg, **kwargs):
    if request.POST.get('cancel_button'):
        messages.info(self.request, u"Створення скасовано")
        return HttpResponseRedirect(
            u'%s?status_message=Створення скасовано'
            % reverse('home'))
    else:
        messages.success(self.request, u"Студент успішно створений") 
        return super(StudentCreateView, self).post(
            request,*arg, **kwargs)
def get_context_data(self, **kwargs):
    context = super(StudentCreateView, self).get_context_data(**kwargs)
    context['meta'] = u'Додавання студента'
    context['headtext'] = context['meta']
    return context

В этом представлении я проверяю функцию записи, если нажата кнопка отмены

self.helper.layout[-1] = FormActions(
        Submit('add_button',u'Зберегти', css_class='btn btn-primary'),
        Submit('cancel_button', u'Скасувати'),
        )

Только при создании представления отмена не работает должным образом. При щелчке он пытается проверить форму и отвечает мне, чтобы решить все проблемы в форме, когда я хочу отменить. Я изменил кнопку "Отправить", и кнопка "Отмена" не имеет никакого эффекта. Я нашел вариант в stackru с добавлением метода onclick к кнопке, но это не для меня (Когда я отменяю или публикую форму в информационном сообщении с перенаправленным окном, мне сообщают о статусе отправки или отмены. Поэтому, когда я попробовал метод onclick, он нажал на Прошлая страница, поэтому информационное сообщение не показывалось. Как исправить отмену на CreateView?

4 ответа

Добавлять Cancel кнопка и использование window.location.href в onclick событие:

self.helper.add_input(Button('cancel', 'Cancel', css_class='btn-primary',
                             onclick="window.location.href = '{}';".format(reverse('your-cancel-url-name'))))

Другой способ, если вы предпочитаете, - передать HTML как есть:

    from crispy_forms.layout import HTML
    self.helper.layout = Layout(
            Fieldset(
                'Title',
                'field1',
                'field2',
                'field3'
            ),
            FormActions(
                        Submit('save', 'Save'),
                        HTML('<a class="btn btn-primary" href="/">Cancel</a>')
                    )
     )

self.helper.layout.append( FormActions( submit, Submit('cancel_button', u'Скасувати', css_class="btn btn-link"),))

Это странно, но работает:

      from crispy_forms.bootstrap import FormActions
from crispy_forms.layout import Fieldset, HTML, Layout, Submit

rows = [el for el in self.fields]  # self == form
rows.append(
    FormActions(
        Submit('Save', _('Save')),
        HTML(f'<a href="{reverse("focov:choose-regulation")}" class="btn btn-outline-secondary">{_("Cancel")}</a>'),
    css_class="row"),
)
self.helper.layout = Layout(
    Fieldset('', *rows),
)
Другие вопросы по тегам