Django return 基于对象是否已创建的不同视图 class
Django return different class-based view according to whether an object has been created
我希望,如果可能的话,有一个根据对象是否存在的函数,它会调用我的 CreateView 或我的 UpdateView 并重定向到视图的相应模板。
我已经创建了 CreateView 和 UpdateView,它们都可以单独工作。
我试图创建一个函数来每次调用相关模板,但它没有重定向。我认为我需要它来重定向是错误的,但我想不出别的东西。
这是我的代码:
def getArchived(request):
archived = ''
q = request.GET.get('q',None)
archived = Archivedfolder.objects.get(folder=q)
template_create = "commondev/Archivedfolder/create.html"
template_update = "commondev/Archivedfolder/update.html"
if archived.pk:
return render(request,template_update)
else:
return render(request,template_create)
在我展示的代码中,我使用了 render() 。我也试过 HttpResponse(),HttpResponseRedirect(),redirect(),render_to_response().
编辑
我的更新视图:
class DataUpdate(UpdateView):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
self.app = ''
self.app1 = self.request.GET.get('app',None)
if self.app1 != None:
self.app = self.app1
else:
self.app = eval(self.kwargs['table'])._meta.app_label
print(self.app)
self.model = apps.get_model(app_label=self.app, model_name=self.kwargs['table'])
self.template_name = "{0}/{1}/update.html".format(self.app,self.kwargs['table'],self.kwargs['table'])
self.form_class = eval('{0}Form'.format(self.kwargs['table']))
self.myurl = str(self.app) + ':data-list'
self.back_url = reverse_lazy(self.myurl, kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table']})
#self.success_url = reverse_lazy('ori_building:data-update', kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table'],'form':self.kwargs['form'],'pk':self.object.pk})
self.request.session['url'] = reverse_lazy('{0}:data-list'.format(self.app), kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table']})
return super(DataUpdate, self).dispatch(*args, **kwargs)
def get_object(self):
# # Call the superclass
obj = super(DataUpdate, self).get_object()
return obj
def get_form_kwargs(self):
kwargs = super(DataUpdate, self).get_form_kwargs()
kwargs.update({'request': self.request})
kwargs.update({'user': self.request.user})
kwargs.update({'app': self.app})
kwargs.update({'table': self.kwargs['table'].lower()})
return kwargs
def form_valid(self, form):
obj = form.save(commit=False)
if self.kwargs['table'] == 'Archivedfolder':
q = self.request.GET.get('q',None)
deviant = Libraryfolder.objects.get(pk=int(q))
obj = self.model.objects.get(deviant=int(deviant.pk))
obj = form.save(commit=False)
obj.user_id = self.request.user.pk
obj.deviant = deviant
obj.save()
form.save_m2m()
else:
obj = form.save()
form.save_m2m()
if self.request.POST.get('is_popup'):
obj = form.save()
popup = 1
a = checkPopup(obj)
return a
else:
return super(DataUpdate, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(DataUpdate, self).get_context_data(**kwargs)
context['app_name'] = self.app
context['table'] = self.kwargs['table']
context['back'] = self.back_url
context['name'] = page_title
context['page_title'] = page_title
context['mybase'] = "{0}/base.html".format(self.app)
return context
如果您已经创建了可用的 CreateView 和 UpdateView(我假设我们正在谈论 django 的 View 子类),请在其中设置适当的模板,然后return正确观点:
def getArchived(request):
q = request.GET.get('q',None)
try:
archived = Archivedfolder.objects.get(folder=q)
return DataUpdate.as_view()(
request,
is_list=is_list,
table=table,
pk=pk
)
except Archivedfolder.DoesNotExist:
return CreateView.as_view()(request)
编辑
如果您的 url 中有 is_list
、table
和 pk
参数,您会在 request
旁边的“作为参数查看”中找到它们.您还可以将它们用作 kwargs
,所以不要忘记参数的名称。编辑上面的代码。
我希望,如果可能的话,有一个根据对象是否存在的函数,它会调用我的 CreateView 或我的 UpdateView 并重定向到视图的相应模板。
我已经创建了 CreateView 和 UpdateView,它们都可以单独工作。
我试图创建一个函数来每次调用相关模板,但它没有重定向。我认为我需要它来重定向是错误的,但我想不出别的东西。
这是我的代码:
def getArchived(request):
archived = ''
q = request.GET.get('q',None)
archived = Archivedfolder.objects.get(folder=q)
template_create = "commondev/Archivedfolder/create.html"
template_update = "commondev/Archivedfolder/update.html"
if archived.pk:
return render(request,template_update)
else:
return render(request,template_create)
在我展示的代码中,我使用了 render() 。我也试过 HttpResponse(),HttpResponseRedirect(),redirect(),render_to_response().
编辑 我的更新视图:
class DataUpdate(UpdateView):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
self.app = ''
self.app1 = self.request.GET.get('app',None)
if self.app1 != None:
self.app = self.app1
else:
self.app = eval(self.kwargs['table'])._meta.app_label
print(self.app)
self.model = apps.get_model(app_label=self.app, model_name=self.kwargs['table'])
self.template_name = "{0}/{1}/update.html".format(self.app,self.kwargs['table'],self.kwargs['table'])
self.form_class = eval('{0}Form'.format(self.kwargs['table']))
self.myurl = str(self.app) + ':data-list'
self.back_url = reverse_lazy(self.myurl, kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table']})
#self.success_url = reverse_lazy('ori_building:data-update', kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table'],'form':self.kwargs['form'],'pk':self.object.pk})
self.request.session['url'] = reverse_lazy('{0}:data-list'.format(self.app), kwargs={'is_list':0,'app':self.app,'table':self.kwargs['table']})
return super(DataUpdate, self).dispatch(*args, **kwargs)
def get_object(self):
# # Call the superclass
obj = super(DataUpdate, self).get_object()
return obj
def get_form_kwargs(self):
kwargs = super(DataUpdate, self).get_form_kwargs()
kwargs.update({'request': self.request})
kwargs.update({'user': self.request.user})
kwargs.update({'app': self.app})
kwargs.update({'table': self.kwargs['table'].lower()})
return kwargs
def form_valid(self, form):
obj = form.save(commit=False)
if self.kwargs['table'] == 'Archivedfolder':
q = self.request.GET.get('q',None)
deviant = Libraryfolder.objects.get(pk=int(q))
obj = self.model.objects.get(deviant=int(deviant.pk))
obj = form.save(commit=False)
obj.user_id = self.request.user.pk
obj.deviant = deviant
obj.save()
form.save_m2m()
else:
obj = form.save()
form.save_m2m()
if self.request.POST.get('is_popup'):
obj = form.save()
popup = 1
a = checkPopup(obj)
return a
else:
return super(DataUpdate, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(DataUpdate, self).get_context_data(**kwargs)
context['app_name'] = self.app
context['table'] = self.kwargs['table']
context['back'] = self.back_url
context['name'] = page_title
context['page_title'] = page_title
context['mybase'] = "{0}/base.html".format(self.app)
return context
如果您已经创建了可用的 CreateView 和 UpdateView(我假设我们正在谈论 django 的 View 子类),请在其中设置适当的模板,然后return正确观点:
def getArchived(request):
q = request.GET.get('q',None)
try:
archived = Archivedfolder.objects.get(folder=q)
return DataUpdate.as_view()(
request,
is_list=is_list,
table=table,
pk=pk
)
except Archivedfolder.DoesNotExist:
return CreateView.as_view()(request)
编辑
如果您的 url 中有 is_list
、table
和 pk
参数,您会在 request
旁边的“作为参数查看”中找到它们.您还可以将它们用作 kwargs
,所以不要忘记参数的名称。编辑上面的代码。