基于Django类的视图,具有弹出功能

时间:2014-01-15 15:38:24

标签: django django-forms django-views

我想问一下以下实现对于视图和基于类的视图的Django规则是否合理。 这个场景,我为用户实现了一个迷你管理部分,不想授予访问Django的一般管理部分的权限。 我对实现很好,一切都运行正常,最近我还添加了一个小的mixin,允许用户添加相关项目的django管理方式,mixin工作正常(基于Django管理界面的原始mixin)。只是想问一下这是一个好方法还是我应该转向另一个实现? (这仍然有点粗糙,仅用于测试)

mixin,我们实际上正在检查查询args,_popup,这与django admin检查传递的弹出窗口几乎相同,这允许表单正常加载,如果直接处理它或作为弹出窗口通过调用父母表格。 partials / popup_reponse.html

class PopupMixin(object):
    is_popup = False
    popup_var = '_popup'

    def get_context_data(self, **kwargs):
        ''' Add the _popup to the context, so we can propagade the templates'''
        context = super(PopupMixin, self).get_context_data(**kwargs)
        if self.popup_var in self.request.GET:
            self.is_popup = True
        context['is_popup'] = self.is_popup
        return context

    def form_valid(self, form):
        if self.popup_var in self.request.POST:
            self.is_popup = True
        ''' If this is a popup request, then we are working with a form
        this means we save the form, and then override the default form_valid implementation
        this allows us to inject newly created items in the form '''
        if self.is_popup:
            self.object = form.save()
            return SimpleTemplateResponse('partials/popup_response.html', {
                'value': self.object.id,
                'obj': self.object
            })
        return super(PopupMixin, self).form_valid(form)

然后我们创建:

class TestCreateView(PopupMixin,CreateView):
    form_class = TestForm
    template_name = "add.html"
    success_url = reverse_lazy('manager-list-tests')

这种方式在视图中,我可以确保首先基本模板只加载裸形而不加载任何其他模板部分,另外我可以在表单中添加隐藏字段:

{% if is_popup %}
<input type="hidden" name="_popup" value=1>
{% endif %}

通过这个我覆盖默认的form_valid以使用与django admin使用相同的模板进行响应:

<!DOCTYPE html>
<html>
  <head><title></title></head>
  <body>
    <script type="text/javascript">
      opener.dismissAddAnotherPopup(window, "{{ value }}", "{{ obj }}");
    </script>
  </body>
</html>

0 个答案:

没有答案