Django根据是否已创建对象返回不同的基于类的视图

时间:2017-04-26 11:25:02

标签: python django django-class-based-views

我想,如果可能的话,根据对象是否存在,它会调用我的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

1 个答案:

答案 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_listtablepk个参数,则可以在request旁边的View中作为参数获取它们。你也将它们用作kwargs,所以不要忘记参数的名称。上面编辑过的代码。