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_listtablepk 参数,您会在 request 旁边的“作为参数查看”中找到它们.您还可以将它们用作 kwargs,所以不要忘记参数的名称。编辑上面的代码。