Python 如何在Django中使用decorator保存post数据
我在django应用程序中有以下视图Python 如何在Django中使用decorator保存post数据,python,django,forms,decorator,Python,Django,Forms,Decorator,我在django应用程序中有以下视图 def edit(request, collection_id): collection = get_object_or_404(Collection, pk=collection_id) form = CollectionForm(instance=collection) if request.method == 'POST': if 'comicrequest' in request.POST:
def edit(request, collection_id):
collection = get_object_or_404(Collection, pk=collection_id)
form = CollectionForm(instance=collection)
if request.method == 'POST':
if 'comicrequest' in request.POST:
c = SubmissionLog(name=request.POST['newtitle'], sub_date=datetime.now())
c.save()
else:
form = CollectionForm(request.POST, instance=collection)
if form.is_valid():
update_collection = form.save()
return redirect('viewer:viewer', collection_id=update_collection.id)
return render(request, 'viewer/edit.html', {'form': form})
它显示允许您编辑图像集合的表单。my html的页脚包含一个表单,允许您向管理员请求新的图像源。它提交到与CollectionForm不同的数据模型。因为这在每个视图的页脚中,所以我想提取代码的第5-7行,并将其转换为装饰器。这可能吗?如果可能的话,我该怎么做呢?我会创建一个新视图来处理表单的发布。然后将一个空白表单实例粘贴到上下文处理器或其他东西中,这样您就可以在每页上打印出来 如果您确实想制作装饰器,我建议使用基于类的视图。这样,您就可以轻松地创建一个处理表单的基本视图类,其他视图都可以扩展它 编辑: 以下是关于基于类的视图的文档: 注意,我仍然建议为表单帖子提供一个单独的视图,但以下是基于类的视图的解决方案:
class SubmissionLogFormMixin(object):
def get_context_data(self, **kwargs):
context = super(SubmissionLogFormMixin, self).get_context_data(**kwargs)
# since there could be another form on the page, you need a unique prefix
context['footer_form'] = SubmissionLogForm(self.request.POST or None, prefix='footer_')
return context
def post(self, request, *args, **kwargs):
footer_form = SubmissionLogForm(request.POST, prefix='footer_')
if footer_form.is_valid():
c = footer_form.save(commit=False)
c.sub_date=datetime.now()
c.save()
return super(SubmissionLogFormMixin, self).post(request, *args, **kwargs)
class EditView(SubmissionLogFormMixin, UpdateView):
form_class = CollectionForm
model = Collection
# you can use SubmissionLogFormMixin on any other view as well.
注意,这是非常粗糙的。不确定它是否能完美工作。但这应该会给你一个想法。我会创建一个新视图来处理表单的帖子。然后将一个空白表单实例粘贴到上下文处理器或其他东西中,这样您就可以在每页上打印出来 如果您确实想制作装饰器,我建议使用基于类的视图。这样,您就可以轻松地创建一个处理表单的基本视图类,其他视图都可以扩展它 编辑: 以下是关于基于类的视图的文档: 注意,我仍然建议为表单帖子提供一个单独的视图,但以下是基于类的视图的解决方案:
class SubmissionLogFormMixin(object):
def get_context_data(self, **kwargs):
context = super(SubmissionLogFormMixin, self).get_context_data(**kwargs)
# since there could be another form on the page, you need a unique prefix
context['footer_form'] = SubmissionLogForm(self.request.POST or None, prefix='footer_')
return context
def post(self, request, *args, **kwargs):
footer_form = SubmissionLogForm(request.POST, prefix='footer_')
if footer_form.is_valid():
c = footer_form.save(commit=False)
c.sub_date=datetime.now()
c.save()
return super(SubmissionLogFormMixin, self).post(request, *args, **kwargs)
class EditView(SubmissionLogFormMixin, UpdateView):
form_class = CollectionForm
model = Collection
# you can use SubmissionLogFormMixin on any other view as well.
注意,这是非常粗糙的。不确定它是否能完美工作。但这应该会给你一个主意。为什么不为页脚表单提供单独的视图?为什么不为页脚表单提供单独的视图?我很难找到关于在Django中创建自己的基于类的视图的合适文档或教程。你能推荐一个或者给我看一个你正在谈论的代码示例吗?用它自己的观点来处理它会更容易。另外,你不必担心确保每个视图都包含该混音。我同意。那绝对是最理想的。我只是想给出一个基于类的视图混合的例子。谢谢大家的帮助。我将使用单独的视图。在Django中创建自己的基于类的视图时,我很难找到合适的文档或教程。你能推荐一个或者给我看一个你正在谈论的代码示例吗?用它自己的观点来处理它会更容易。另外,你不必担心确保每个视图都包含该混音。我同意。那绝对是最理想的。我只是想给出一个基于类的视图混合的例子。谢谢大家的帮助。我将使用一个单独的视图。