我想,如果可能的话,根据对象是否存在,它会调用我的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()。
修改 我的UpdateView:
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
答案 0 :(得分:1)
如果您已经创建了工作CreateView和UpdateView(我假设我们正在讨论django的View子类),请在其中设置适当的模板 ,然后返回正确的视图:
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)
修改强>
如果您的网址中包含is_list
,table
和pk
个参数,则可以在request
旁边的View中作为参数获取它们。你也将它们用作kwargs
,所以不要忘记参数的名称。上面编辑过的代码。