我正在尝试在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'
。那是为什么?
答案 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)
CreateView
有post()
方法,它继承自ProcessFormView
。您可以找到方法来源here。至于源代码中的问题,您可能会看到form_valid
和form_invalid
方法仅针对POST
请求触发。
您不需要覆盖form_invalid
方法,因为默认情况下它会呈现表单错误的无效表单。而且,您也不需要覆盖form_valid
,CreateView
之后会自动重定向。所以你可以这么简单:
class SimilarStoreCreateView(CreateView):
model = SimilarStore
form_class = SimilarStoreForm
template_name='cms/similarstore_new.html'
success_url=reverse_lazy('cms:similarstore')
这将为您提供与基于函数的视图相同的逻辑。
答案 2 :(得分:1)
基本上,您只需要当前的设置。你看,BaseCreateView
的{{1}}方法实际上是它的基类'post
)ProcessFormView
方法,它调用自己的基类(post
)SimilarStoreCreateView
方法,即
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"])
方法。