2016-08-09 11 views
0

OK - 私は、Djangoでのフォームの動作を基本的に理解しているので、30万フィートの概念説明を歓迎します。Django ModelFormを動作させるのに問題がある

(ほとんど)1つのビュー(および単一のテンプレート)からモーダルポップアップを使用して情報を表示(作業)し、編集または追加する(動作しない)ようにしています。フォームが表示され、記入して送信をクリックすると、その時点でモーダルは終了しますが、新しいコースは管理ビューに表示されません。

私は、単一のモデルにこれを限定したい - 私の最も簡単なの - 当面:

models.py:

class Course(models.Model): 
    Name = models.CharField(max_length=30,unique=True) 
    Active = models.BooleanField(default=True) 

    def __unicode__(self): 
     return u'%s' % (self.Name) 

views.py

def IndexView(request,Course_id,Section_id): 
    template_name = 'gbook/index.html' 
    print Course_id,Section_id 
    this_course = Course.objects.get(pk=Course_id) 
    active_courses = Course.objects.all().filter(Active=True).exclude(pk=Course_id) 
    section_list = Section.objects.all().filter(course=this_course) 
    if len(section_list) >1: 
     multi_section = True 
    else: 
     multi_section = False 
    active_section = Section.objects.get(pk=Section_id) 
    roster = Student.objects.all().filter(sections__in=[active_section]) 
    announcement_list = Announcement.objects.all().filter(sections__in=[active_section]) 
    courseaddform = CourseAddForm() 

    context = {'active_courses':active_courses, 'this_course': this_course, 
       'active_section':active_section, 'section_list':section_list, 
       'roster':roster, 'multi_section':multi_section, 
       'announcement_list':announcement_list, 'courseaddform':courseaddform} 
    return render(request,'gbook/index.html', context) 

forms.pyを

class CourseAddForm(forms.ModelForm): 
    class Meta: 
     model = Course 
     fields = ['Name', 'Active'] 

テンプレート/ index

... 
     <li class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span><span class="caret"></span></a> 
      <ul class="dropdown-menu"> 
      <li><a data-toggle="modal" data-target="#SectionRosterModal">Roster</a></li> 
      <li><a data-toggle="modal" data-target="#AnnouncementModal">Announcements</a></li> 
      <li><a data-toggle="modal" data-target="#CourseAddModal">CourseAdd</a></li> 

      </ul> 
     </li> 
... 
<!-- COURSE ADD MODAL --> 
<div class="modal fade" id="CourseAddModal" role="dialog"> 
<div class="modal-dialog"> 

    <!-- Modal content--> 
    <div class="modal-content"> 
    <div class="modal-header" style="padding:5px 10px;"> 
     <button type="button" class="close" data-dismiss="modal">&times;</button> 
     <h4>Add Course</h4> 
    </div> 
    <div class="modal-body" style="padding:10px 10px;"> 
     <form data-parsley-validate method="post" id="courseaddform" action="" enctype="multipart/form-data" 
       data-parsley-trigger="focusout"> 

     {% csrf_token %} 

     {{ courseaddform.as_p }} 

     <p id="login-error"></p> 

     <input type="submit" class="btn btn-info submit" name="AddCourse" value="Add Course" /> 
     </form> 
    </div> 
    <div class="modal-footer"> 
    </div> 
    </div> 

</div> 
</div> 
... 

.HTML私はどこかにPOSTコマンドがあるように思わだと思うが、私は本当にここでの処理で良いのハンドルを持っていません。助けてくれてありがとう!

+0

実際の問題は、ここで何を壊していないのだろうか?それはあなたが提出をヒット時に動作していない?それともフォームを表示していないのですか? – nkhumphreys

+0

フォームが表示されます。私がクリックすると、モーダルは終了しますが、何も起こりません(管理者の表示で追加のコースはありません) – DeltaG

答えて

0

それはあなたが戻って投稿するときは、フォームデータを使って何をしていないように見える、あなたがフォームを処理する必要があるリクエストメソッドがPOST

def IndexView(request, ...): 
    if request.method == "GET": 
     ... do what you are doing now and return 
    elif request.method == "POST": 
     cf = CourseAddForm(request.POST) 
     if cf.is_valid(): 
      ...do stuff with cf.cleaned_data <---- this is a dict 
      return .... 

ある場合は、GETのために同じことをやっていると、 POSTの今要求と

は詳細

https://docs.djangoproject.com/en/1.10/topics/forms/#the-view

EDはこちらをご覧送信されたフォームでもない取引IT#1:

POSTは、同じURLに戻される標準のHTTP POST要求である必要があります。ただ今のようにmethodタグとaction="."(またはテンプレートのURL参照)を設定してください。

有効なHTTPResponseオブジェクトを返す必要がありますが、フォームを処理する場合は通常、フォームが有効な場合はHTTPResponseRedirect(...some url...)を返します。 1ページアプリの場合、同じページをリロードする場合は、request.method == "GET"で行ったすべての操作を行う必要があります。HTTPResponseRedirectを同じURLに戻すこともできます。この場合、私はdjangoメッセージフレームワークを見て、フォームが正常に送信されたことを示すコンテキストにメッセージを追加し、リロードされたページにメッセージを表示します(メッセージを使用するときに常に表示するメッセージがあるかどうかを常に確認してください)フレームワークは、これが初めてのページをロードしている場合)

https://docs.djangoproject.com/en/1.9/ref/contrib/messages/

+0

@DeltaGは私の書式を修正してくれてありがとう:) – nkhumphreys

+0

:)素早く答えてくれてありがとう。それは役に立ちます。あなたは、POSTのやり方と返すべきことについて少し詳しい情報を提供できますか? – DeltaG

+0

@DeltaGオリジナルの2つのリンクを編集して、スムーズにこの作業を行うために必要なものすべてを提供する必要があります。 – nkhumphreys

関連する問題