django updateview预览按钮

时间:2013-12-11 15:02:29

标签: django

我想知道如何为django UpdateView页面构建一个“预览”按钮。

我首先在模板中向表单添加第二个按钮:

<button type="preview" class="btn btn-default" value="preview" name="preview">{% trans 'Preview' %}</button>

然后我在代码中覆盖form_valid方法:

 def form_valid(self, form):
    if 'preview' in self.request.POST:
        #??? Don't know what to do here
    return super(SongEditView, self).form_valid(form)

但我不知道在使用当前表单值而不是数据库值时调用哪个方法来刷新UpdateView。它可能与上下文有关...但我没有找到调用刷新(渲染?)我的页面的方法。

PS:“stackoverflow”的预览非常棒,怎么做,使用ajax?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案(可能不是最好的):

我的模板中有2个按钮(名称相同,但值不同):

<button type="submit" class="btn btn-default" value="submit" name="submit">{% trans 'Submit' %}</button>
<button type="preview" class="btn btn-default" value="preview" name="submit">{% trans 'Preview' %}</button>

在form_valid()中,如果用户点击预览按钮然后再次调用我的页面,我会将预览放入会话中。

def form_valid(self, form):
    if self.request.POST['submit'] == 'preview':
        self.request.session['previewsong'] = self.request.POST['body']
        return HttpResponseRedirect(reverse('editsong', args={self.object.id, self.object.nice_url}))
    return super(SongEditView, self).form_valid(form)

最后,我还会覆盖get_context_data方法来读取会话信息并填写表单并使用会话中的值进行预览。

    def get_context_data(self, **kwargs):
    context = super(SongEditView, self).get_context_data(**kwargs)
    if('previewsong' in self.request.session):
        context['preview'] = self.request.session['previewsong']
        context['form'].initial['body'] = self.request.session['previewsong']
        del self.request.session['previewsong']
    return context

有更好的方法吗?我不能用javascript做,因为我有一些django过滤器来显示渲染。