2014-10-10 51 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

相關問題