django:将参数传递给自定义视图类(继承版)

时间:2012-05-23 14:34:05

标签: django

再次为可能是一个简单的问题道歉!

好的,所以!

我的问题是我有一个saveModel函数,它保存了一个模型。如果模型都很好(is_valid),它将保存模型并重定向到pageA

如果模型不好,或者请求是GET,那么我想重定向到pageB

一切都很好,但我这样做了几次,多么烦人!我不想一直剪切和粘贴,所以我想出了这个:

class SaveModel(View):
    def as_view(self):
        if request.method == "POST":
            form = SaveModel.getPostForm(self.request)
            if form.is_valid():
                processedForm = SaveModel.processForm(self.request)
                processedForm.save()
                if (self.success_template):
                    return render_to_response(self.success_template)
                else:
                    return render_to_response('pageA.html')
        else:
            form = SaveModel.getForm()
        if (self.context_object_name):
            contextName = context_object_name
        else:
            contextName = 'form'
        if (self.template_name):
            return render_to_response(template_name,{contextName:form})
        else :
            return render_to_response('pageB.html',{contextName:form})

    def getForm(self):
        return None

    def getPostForm(self,request):
        return None

    def processForm(self,form,request):
        return None

那么,我定义了其他类来处理特定的模型,例如,所以:

class StoryModelView(SaveModel):
    def getForm(self,request):
        return StoryForm()

    def getPostForm(self,request):
        return StoryForm(request.POST)

    def processForm(self,form,request):
        theStory = form.save(commit=False)
        theStory.user = request.user
        return theStory

然后,最后,在我的urls.py中,我将引用(如上所述)模型,如下所示:

url(r'^addStory/$',
    StoryModelView.as_view(
        context_object_name='form',
        template_name='accounts/addStory.html',
        success_template='accounts/addStorySuccess.html'
    )
),

这似乎不起作用 - pycharm向我保证我对self.context_object_name等的引用无效。我是对python和django的新手(这就是为什么我以为我会用他们建立一个网站!聪明的安德鲁!),所以我确信我错过了很多东西(抽象的方法和东西。 .. python做到了,对吗?)

我需要做些什么才能让这一切都有效?这是我应该做的事情吗?

1 个答案:

答案 0 :(得分:0)

我的答案!

好的,所以大家写的关于CreateView的评论都可能是正确的。 “可能”因为我从未结束使用它,因为我最终坚持使用我的代码。

如果有人像我一样,是python和django的新手,想看看整个事情是如何运作的,我们就在这里!

class SaveModel(View):
    success_template = None
    context_object_name = None
    template_name = None

    def post(self, request):
        form = self.getPostForm(self.request)
        if form.is_valid():
            processedForm = self.processForm(form,self.request)
            processedForm.save()
            if self.success_template:
                return render_to_response(self.success_template)
            else:
                return render_to_response('accounts/addStorySuccess.html')
        else:
            self.renderValidations(form)

    def get(self,request):
        form = self.getForm()
        self.renderValidations(form)

    def renderValidations(self,form):
        if self.context_object_name:
            contextName = self.context_object_name
        else:
            contextName = 'form'
        if self.template_name:
            return render_to_response(self.template_name,{contextName:form})
        else :
            return render_to_response('accounts/addStory.html',{contextName:form})

    def getForm(self):
        return None

    def getPostForm(self,request):
        return None

    def processForm(self,form,request):
        return None    

那是主类,然后我可以像这样覆盖它:

class StoryModelView(SaveModel):
    def getForm(self):
        return StoryForm()

    def getPostForm(self,request):
        return StoryForm(request.POST)

    def processForm(self,form,request):
        theStory = form.save(commit=False)
        theStory.user = request.user
        return theStory

我绊倒了几次“python”中的“self”如何工作。它似乎是神奇地发送所有方法调用,但你需要它作为方法声明中的第一个arg(但你在调用/使用方法时永远不需要使用它)

我认为在覆盖View类时只有post或get for方法。我不太了解电话的“过程”,或订单是什么,调度被提及作为覆盖的东西,但我怀疑只是我需要改变何时/如何处理不同的请求类型(GET,POST,HEAD等)

哦! urls.py!

url(r'^addStory/$',
    StoryModelView.as_view(
        context_object_name='form',
        template_name = 'accounts/addStory.html',
        success_template= 'accounts/addStorySuccess.html'
    )
),

我可以把我想要的东西扔到那个“as_view”调用中,然后,只要这些参数在覆盖类中定义就可以了。

所以耶!我的课程都很有效,女人也想要我。使用我的代码,这也可能发生在你身上!*

*结果非典型和虚构。您的结果可能会有所不同。