Сохранение в django формах с использованием FormView - PullRequest
1 голос
/ 27 марта 2020

Я создаю форму, которая изменит состояние резервной книги, у меня есть

    class LibraryReserveForm(CrispyFormMixin, forms.Form):

          def __init__(self, *args, **kwargs):
              self.manager = kwargs.pop('manager')
              super(LibraryReserveForm, self).__init__(*args, **kwargs)

          def save(self):
              self.instance.reserve_status = 'approved'

              self.instance.save()

              return self.manager

models.py

    class ReservedBooks(TimeStampedModel):

        BOOK_RESERVE_STATUS = Choices(
             ('for_approval', "For Approval"),
             ('approve', "Approved"),
             ('cancelled', "Cancelled"),
             ('rejected', "Rejected")
        )

        reserve_status = models.CharField(
               _('Status'),
               max_length=32,
               choices=BOOK_RESERVE_STATUS,
               default='for_approval'
        )

    ...

view

    class LibraryReserveView(
          ProfileTypeRequiredMixin,
          MultiplePermissionsRequiredMixin,
          FormView,
    ):

    model = ReservedBooks
    template_name = 'library/reserved_list.html'
    form_class = LibraryReserveForm

    def get_form_kwargs(self):
        kwargs = super(LibraryReserveView, self).get_form_kwargs()

        kwargs.update({
            'manager': self.request.user.manager,
        })

        return kwargs

urls

    url(
        r'^reserve/(?P<pk>\d+)/$',
        views.LibraryReserveView.as_view(),
        name='reserved'
    ),

каждый раз, когда я отправляю кнопку, я печатаю что-то в методе save () форм, но что-то не печатает, поэтому этот метод не вызывается. Как вы назвали метод сохранения? Спасибо

1 Ответ

0 голосов
/ 28 марта 2020

A FormView не обрабатывает сохранение объекта. Он просто вызывает form_valid, который будет перенаправлять на success_url. Но UpdateView добавляет стандартный код для передачи экземпляра в форму и сохраняет форму.

Вы работаете с Form, но Form не имеет атрибута .instance. ModelForm имеет, так что, возможно, было бы лучше использовать ModelForm здесь:

class LibraryReserveForm(CrispyFormMixin, forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.manager = kwargs.pop('manager')
        super(LibraryReserveForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.instance.reserve_status = 'approved'
        return super().save(*args, **kwargs)

Тогда мы можем использовать UpdateView:

from django.views.generic import <b>UpdateView</b>

class LibraryReserveView(
          ProfileTypeRequiredMixin,
          MultiplePermissionsRequiredMixin,
          <b>UpdateView</b>
    ):

    model = ReservedBooks
    template_name = 'library/reserved_list.html'
    form_class = LibraryReserveForm
    success_url = &hellip;

    def get_form_kwargs(self):
        kwargs = super(LibraryReserveView, self).get_form_kwargs()
        kwargs.update(
            manager=self.request.user.manager
        )
        return kwargs

Вы по-прежнему здесь нужно указать sucess_url: URL-адрес, на который будет перенаправлен успешный запрос POST для реализации шаблона Post / Redirect / Get [wiki] .

...