2014-10-10 48 views
1

我在我的django应用程序中有以下视图。如何使用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: 
      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}) 

它显示一个表单,允许您编辑一组图像。我的html页脚包含一个表单,允许您从管理员请求新的图像源。它提交给与CollectionForm不同的数据模型。由于这是在每个视图的底部,我想提取代码的第5-7行并将其变成装饰器。这是可能的,如果是这样,我该怎么做呢?

+2

为什么不为您的页脚的表单提供单独的视图? – Ngenator 2014-10-10 18:31:30

回答

4

我会提出一个新的观点来处理表单的帖子。然后将一个空白表单实例粘贴到上下文处理器或其他内容中,以便在每个页面上打印出来。

如果你确实想做一个装饰者,我会建议使用基于类的视图。这样,您可以轻松地创建一个处理表单的基本视图类,并且每个其他视图都可以扩展它。

编辑:

下面是基于类视图文档:https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/

注意,我还是希望推荐具有对表单POST一个单独的视图,但在这里是您的解决方案可能是什么样子与基于类的意见:

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. 

请注意,这是非常粗糙的。不知道它是否会完美工作。但是这应该给你一个想法。

+0

我很难找到体面的文档或教程在Django中创建自己的基于类的视图。你能推荐一个还是给我看一个你正在谈论的代码示例? – 2014-10-10 19:42:27

+0

我更新了答案 – jproffitt 2014-10-10 20:02:07

+0

只需要处理它自己的视角就会更容易。另外,您不必担心确保每个视图都包含该mixin。 – Ngenator 2014-10-10 20:31:33

相关问题