我想问一下以下实现对于视图和基于类的视图的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>