1

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

好的,所以!

我的问题是我有一个 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 会这样做,对吗?)

我需要做什么才能让这一切正常工作?这是我应该做的事情吗?

4

1 回答 1

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 中的工作方式感到困惑。它似乎与所有方法调用一起神奇地发送,但你需要它作为方法声明中的第一个参数(但在调用/使用方法时你永远不需要使用它)

我认为覆盖 View 类时只有 post 或 get 方法。我对调用的“过程”或顺序不是很清楚,调度被提及为要覆盖的东西,但我怀疑这只是我需要更改何时/如何处理不同请求的地方类型(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”调用中,然后,只要在覆盖类中定义了这些参数,一切都很好。

太好了!我的班级所有的工作和女性想要我。使用我的代码,这也可能发生在你身上!*

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

于 2012-05-23T17:23:19.650 回答