【问题标题】:How to do form handling in Django Generic CBV?如何在 Django Generic CBV 中进行表单处理?
【发布时间】:2018-06-15 17:55:36
【问题描述】:

我正在尝试在下面的 Django Generic CBV 中做同样的事情。

基于函数的视图

def form_handling(request):
    if request.method == "POST":
        form = SimilarStore(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('...')   
    else:
        form = SimilarStore()
    ...

基于类的视图

class SimilarStoreCreateView(CreateView):
    model = SimilarStore
    form_class = SimilarStoreForm
    template_name='cms/similarstore_new.html'
    success_url=reverse_lazy('cms:similarstore')

    def form_valid(self, form):
        form = SimilarStoreForm(self.request.POST, self.request.FILES)
        form.save()
        return redirect(self.get_success_url())

    def form_invalid(self, form):
        form = SimilarStoreForm()
    ...

我对如何在 Django Generic CBV 中检查 request.method 是 POST 还是 GET 感到困惑。我知道 Django 常规 CBV 支持 get()post()。但是,在通用视图中,没有 post()。在 Django Generic 中我应该如何处理 POST 请求?

另外,我的 CBV 代码会引发错误 'SimilarStoreForm' object has no attribute 'cleaned_data'。这是为什么呢?

【问题讨论】:

    标签: django


    【解决方案1】:

    CreateViewpost() 方法,它继承自 ProcessFormView。您可以找到方法源here。至于源代码中的问题,您可能会看到 form_validform_invalid 方法将仅针对 POST 请求触发。

    您不需要覆盖form_invalid 方法,因为默认情况下它会呈现无效的表单并显示表单错误。而且您也不需要覆盖form_validCreateView 之后会自动重定向。所以你可以简单地做:

    class SimilarStoreCreateView(CreateView):
        model = SimilarStore
        form_class = SimilarStoreForm
        template_name='cms/similarstore_new.html'
        success_url=reverse_lazy('cms:similarstore')
    

    这将为您提供与基于函数的视图相同的逻辑。

    【讨论】:

      【解决方案2】:

      CreateViews 有一个 post 方法,你可以使用如下所示

      def post(self, request, *args, **kwargs):
          self.object = None
          return super().post(request, *args, **kwargs)
      

      Here is a good reference for all the methods and attributes of CBVs

      【讨论】:

        【解决方案3】:

        基本上,您当前的设置就是您所需要的。你看,CreateViewpost 方法实际上是它的基类 (BaseCreateView) post 方法,它调用了它自己的基类 (ProcessFormView) post 方法,那是

        类 ProcessFormView(视图): # ... def post(self, request, *args, **kwargs): """ 处理 POST 请求,使用传递的实例化一个表单实例 POST 变量,然后检查其有效性。 """ 形式 = self.get_form() 如果 form.is_valid(): 返回 self.form_valid(form) 别的: 返回 self.form_invalid(form)

        因此,每当一个 POST HTTP 请求被路由到 SimilarStoreCreateView 时,它最终都会被 dispatched 到前面提到的 post 方法,该方法已经实现了您所需的工作流程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-06
          • 1970-01-01
          • 1970-01-01
          • 2013-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          相关资源
          最近更新 更多