【问题标题】:Saving in django forms using FormView使用 FormView 保存在 django 表单中
【发布时间】:2020-03-27 11:42:10
【问题描述】:

我正在创建一个可以更改预订书状态的表单,我有这个

    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'
        )

    ...

查看

    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

网址

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

每次我提交按钮时,我都会在表单的 save() 方法中打印一些东西,但它没有打印一些东西,因此不会调用该方法。你如何调用保存方法?谢谢

【问题讨论】:

  • 为什么不使用UpdateView?这是一个 FormView,它将使用 url 模式中的 pk 作为主键来更新实例。
  • 你不应该使用ModelForm吗? Form 没有 instance
  • 您的LibraryReserveForm 没有字段,因此它不执行任何操作。
  • 我看到一些代码使用 forms.Forms 进行保存并且它有效。然而,我的不是。我将重新编码这个以使用 UpdateView。谢谢
  • 您好,我也尝试了modelForm,但是当我单击时,保存方法也不会调用。

标签: python django django-forms


【解决方案1】:

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 UpdateView

class LibraryReserveView(
          ProfileTypeRequiredMixin,
          MultiplePermissionsRequiredMixin,
          UpdateView
    ):

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

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

您仍然需要在此处指定sucess_url:成功的POST请求将重定向到的URL以实现Post/Redirect/Get pattern [wiki]

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2014-01-18
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多