如何在Django Generic CBV中进行表单处理?

时间:2018-06-15 17:55:37

标签: django

我正在尝试在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'。那是为什么?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 :(得分:1)

基本上,您只需要当前的设置。你看,BaseCreateView的{​​{1}}方法实际上是它的基类'postProcessFormView方法,它调用自己的基类(postSimilarStoreCreateView方法,即

class ProcessFormView(View):
    # ...
    def post(self, request, *args, **kwargs):
        """
        Handles POST requests, instantiating a form instance with the passed
        POST variables and then checked for validity.
        """
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

因此,每当POST HTTP请求被路由到dispatch时,它最终将post添加到已经实现您所需工作流程的前述Word = "\n".join(subtitle["Content"] for subtitle in json["Subtitles"]) 方法。