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 の初心者です (だからこそ、私はそれらを使って Web サイトを構築すると思ったのです! 賢いアンドリュー!)、たくさんのこと (抽象メソッドなど. .. 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 に答える