如何使用基于django类的视图处理“保存”和“另存为”按钮

时间:2019-01-04 13:27:09

标签: django django-views

我想做的只是一个带有两个提交按钮的简单更新视图:save,它简单地保存更新;还有save-as按钮,它当然会将更新后的表单的副本保存到数据库中,而原始数据保持未编辑状态。

现在,我知道如何在基于函数的视图中执行此操作,只要我的page_edit.html有两个按钮即可:

<input type="submit" class="btn btn-danger" name = "save" value="Save changes">
<input type="submit" class="btn btn-success" name = "save_as" value="Save as new Page">

然后我的简化视图将是:

def page_edit(request, pk):
    if request.method == 'POST':
        if 'save' in request.POST:
            instance = Page.objects.get(pk=pk)
        elif 'save_as' in request.POST:
            instance = Page.objects.create()
        p = PageForm(request.POST, request.FILES, instance=instance)
        if p.is_valid():
            """write to db"""
            p.clean()
            p.save()

            context = {'form': p, 'p_data_in': p.cleaned_data, 'p': p.instance}
        return render(request, '/template/page_detail.html', context)

    else:
        instance = Page.objects.get(pk=pk)
        p = PageForm(instance=instance)
        context = {'form': p, 'p': p.instance}
        return render(request, '/template/page_edit.html', context)

但是,我对基于类的视图导航有些困惑。

我尝试以这种方式使用UpdateView:

class PageEdit(UpdateView):
    model = Page
    form_class = PageForm
    template_name = '/template/page_edit.html'

    def form_valid(self, form):
        if 'save_as' in self.request.POST:
            # current = self.get_context_data()
            f = self.form_class(self.request.POST, self.request.FILES)
            f.save()
        return super(PageEdit, self).form_valid(form)

它确实将新实例保存到数据库。但这也会改变当前的形式,据称该形式未经编辑。

我觉得这应该很简单...但是,由于我是基于类的视图的新手,所以我很努力。

任何帮助将不胜感激。 谢谢:)

1 个答案:

答案 0 :(得分:1)

实际上,实例已更新,因为您调用了Import-Module -Name WebAdministration function SetBindingsIIS { param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$WebsiteName, [HashTable]$protocol ) $Status=$null $GetProtocolName= $protocol["Protocol"] $BindingsCollection=Get-ItemProperty -Path "IIS:\Sites\$WebsiteName" -Name Bindings $ProtocolExists=$BindingsCollection.Collection | Where-Object{$_.protocol -eq $GetProtocolName} Try { if($ProtocolExists -eq $null) { New-ItemProperty -Path IIS:\Sites\$WebsiteName -Name Bindings -Value $protocol -Force } else { Set-ItemProperty -Path "IIS:\Sites\$WebsiteName" -Name Bindings -Value $protocol -Force } $Status="Success" } Catch { $ErrorMessage=$_.Exception.Message $Status="Error in Add/Update bindings : $ErrorMessage" } return $Status } 方法,其中保存了更改(这是原始行为。因此,您需要这样更改它:

SetBindingsIIS -WebsiteName "TestMiddleTierSite" -protocol @{Protocol="http";BindingInformation=":81:"}