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

具有弹出功能的基于Django类的视图,django,django-forms,django-views,Django,Django Forms,Django Views,我想问一下,下面的实现是否符合Django视图规则和基于类的视图。 在这个场景中,我为用户实现了一个小型管理部分,不想授予对Django的general admin部分的访问权。 我对实现很满意,一切都正常工作,最近我还添加了一个小mixin,允许用户以django-admin方式添加相关项目,mixin工作正常(基于django-admin界面的原始mixin)。我只是想问一下,这是一个好方法还是应该转移到另一个实现?(这仍然有点粗糙,只是为了测试) 在mixin中,我们实际上是针对一个查询a

我想问一下,下面的实现是否符合Django视图规则和基于类的视图。 在这个场景中,我为用户实现了一个小型管理部分,不想授予对Django的general admin部分的访问权。 我对实现很满意,一切都正常工作,最近我还添加了一个小mixin,允许用户以django-admin方式添加相关项目,mixin工作正常(基于django-admin界面的原始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 %}
{%if是\u popup%}
{%endif%}
通过此操作,我覆盖了默认的表单_valid,以使用django admin使用的相同模板进行响应:

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

dismissAddAnotherPopup(窗口,{{value}},“{{obj}”);

我只是想说,查看您的代码对我正在开发的实现很有帮助。谢谢您好,很高兴我能够帮助您,尽管您可以将其作为处理器来实现:)让我自己通过这种方式来保持视图更清晰,并将这种逻辑用于处理器:)