再次为可能是一个简单的问题道歉!
好的,所以!
我的问题是我有一个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做到了,对吗?)
我需要做些什么才能让这一切都有效?这是我应该做的事情吗?
答案 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”调用中,然后,只要这些参数在覆盖类中定义就可以了。
所以耶!我的课程都很有效,女人也想要我。使用我的代码,这也可能发生在你身上!*
*结果非典型和虚构。您的结果可能会有所不同。