2017-03-13 24 views
2

現在作業中のDjangoプロジェクトで問題が発生しています。これは正常に動作しますモデルの変更後にDjangoビューが更新されない

class CreatePollView(View): 
    template = "polls/create_poll.html" 

    @method_decorator(login_required) 
    def post(self, request): 
     question_text = request.POST['question'] 
     pub_date = now() 
     new_question = Question(question_text=question_text, pub_date=pub_date) 
     new_question.save() 

     options_list = request.POST.getlist('options') 
     for option in options_list: 
      option_text = option 
      new_option = Option(option_text=option_text, question=new_question) 
      new_option.save() 

     return HttpResponseRedirect(reverse('polls:detail', args=(new_question.id,))) 

は、私はPOSTリクエストを経由してモデルのインスタンスを作成するビューを持っています。私は質問とそのオプションをDBに追加し、それが管理者に追加されていることを確認することができます。しかし、私がindex.htmlを呼び出すと、すべての質問オブジェクトがリストアップされ、更新されません。

class IndexView(View): 
    template = loader.get_template('polls/index.html') 
    questions = Question.objects.all() 
    context = { 
     'question_list': questions, 
    } 

    def get(self, request): 
     return HttpResponse(self.template.render(self.context, request)) 

テンプレート:

{% extends 'homepage/base.html' %} 
{% block content %} 
    <div class="row"> 
     <div class="col-md-6 col-md-offset-3"> 
      <h1>All Polls:</h1> 
      <div> 
       {% for question in question_list %} 
        <p><a href="{{ question.pk }}">{{ question }}</a></p> 

       {% endfor %} 
       <a href="new_poll" class="btn btn-primary">New Poll</a> 
      </div> 
     </div> 
    </div> 
{% endblock %} 

私はビューにエラーを構築する場合、それを修正して、再度コードを実行し、それはリストを更新。 Question.objects.all()

しかし、私が新しいモデルインスタンスを投稿すると、モデルの変更はここに表示されません。誰かが私が間違っていることを教えてもらえますか?

EDIT:これは、クラスベースのビューでのみ発生します。メソッドビューを使用していたとき、正常に機能しました。

def index(request): 
    question_list = Question.objects.all() 
    template = loader.get_template('polls/index.html') 
    context = { 
     'question_list': question_list, 
    } 
    return HttpResponse(template.render(context, request)) 


def new_poll(request): 
    if request.method == 'POST': 
     question_text = request.POST['question'] 
     pub_date = now() 
     new_question = Question(question_text=question_text, pub_date=pub_date) 
     new_question.save() 

     options_list = request.POST.getlist('options') 
     # import pdb 
     # pdb.set_trace() 
     for option in options_list: 
      option_text = option 
      new_option = Option(option_text=option_text, question=new_question) 
      new_option.save() 

     return HttpResponseRedirect(reverse('polls:detail', args=(new_question.id,))) 
    else: 
     template = loader.get_template('polls/create_poll.html') 
     context = { 
      'user': request.user 
     } 
     return HttpResponse(template.render(context, request)) 
+0

一般的なクラスベースのビューを使用すると、これよりもはるかに少ないコードを書くことができます。 –

+0

私はリファクタリングの途中ですが、これはいいですが、最初に私のモデルに変更を表示する方法を理解したいと思います。 – Ozymandias

答えて

2

ジャンゴは(永遠に仕える、負荷1回)実行時間の長いプロセスとして動作するように設計されて、いないすべてのものはそれぞれ、すべてのHTTP要求にリロードされたCGIスクリプトとして。これは、関数の外部で起こっていること(モジュールの最上位レベル、クラスステートメントのボディ内など)がモジュールの最初のインポートで1回だけ(プロセスごとに)実行されることを意味します(まあ、Pythonプロセスの場合と同じですワンショットスクリプトではなく、長時間実行されるプロセスです)。だからここ

:あなたのクラス本体内

class IndexView(View): 
    template = loader.get_template('polls/index.html') 
    questions = Question.objects.all() 
    context = { 
     'question_list': questions, 
    } 

これらの3つのステートメントは、あなたのモジュールの最初のインポートにclass文でeval'dされています。それ以降、これらの値はプロセスのライフタイムでは再評価されません。したがって、サーバープロセスを終了して新しいプロセスを開始するまで、最初の要求後に失効するまで、要求から要求までcontext['question_list']の同じ結果が実際に保持されます。 、など)。

コードは各要求に対して実行され、最新のクエリーセットを生成するため、関数ベースのビューに問題はありません。

、長い話を短くするあなたのクラスgetメソッドにこのコードを移動することで起動するには:次に、あなたはDjangoのformsmodelformsshortcutsなどについて学び、もう少し時間がかかる場合があります

class IndexView(View): 
    def get(self, request): 
     template = loader.get_template('polls/index.html') 
     questions = Question.objects.all() 
     context = { 
      'question_list': questions, 
     } 
     return HttpResponse(template.render(context, request)) 

、およびクラスベースのビューを使用することを主張する場合は、various mixinsも使用する方法を学んでください。

+0

ありがとうございます!これを学ぶのは良いことですが、今は完全に動作します。 – Ozymandias

関連する問題