2016-08-09 176 views
0

OK - Ich bin sicher, dass das Problem ist, dass ich ein grundlegendes Verständnis davon habe, wie Formulare in Django arbeiten, so dass 30.000 ft konzeptionelle Erklärungen willkommen sind, zusätzlich zu Code-Fixes!Problem, Django ModelForm innerhalb Modal zu arbeiten

Ich versuche, meine Website von (meist) einer einzigen Ansicht (und einzelne Vorlage), mit modalen Popups zum Anzeigen von Informationen (arbeiten) und zum Bearbeiten oder Hinzufügen (funktioniert nicht). Ich kann das Formular sehen, es ausfüllen und auf Senden klicken. An diesem Punkt schließt sich das Modal, aber es werden keine neuen Kurse in der Admin-Ansicht angezeigt.

Ich werde dies auf ein einziges Modell beschränken - meine einfachste - einstweilen:

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'] 

Vorlagen/Index .html

... 
     <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> 
... 

Ich denke, dass es angeblich irgendwo in ein POST Befehl sein, aber ich hier nicht wirklich einen guten Griff auf den Prozess haben. Danke für die Hilfe!

+0

was ist das eigentliche Problem hier? Es funktioniert nicht, wenn Sie auf "Senden" klicken. oder zeigt es nicht das Formular an? – nkhumphreys

+0

Das Formular wird angezeigt. Wenn ich klicke, schließt sich das Modal, aber nichts passiert (keine zusätzlichen Kurse in der Admin-Ansicht) – DeltaG

Antwort

0

Es sieht aus wie Sie sind nicht mit den Formulardaten etwas zu tun, wenn Sie wieder zu veröffentlichen, müssen Sie das Formular bearbeiten, wenn die Request-Methode ist ein 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 .... 

Sie sind die gleiche Sache für GET tun und POST-Anfragen jetzt und weder beschäftigt sich mit der vorgelegten Form

hier sehen, um weitere Informationen

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

ED IT # 1:

Der POST sollte eine HTTP-POST-Standardanforderung sein, die an dieselbe URL zurückgesendet wird. Setzen Sie einfach das method-Tag wie Sie jetzt sind und action="." (oder eine URL-Suche in der Vorlage).

Sie müssen ein gültiges HTTPResponse-Objekt zurückgeben, aber der Normalfall beim Umgang mit einem Formular ist die Rückgabe eines HTTPResponseRedirect(...some url...), wenn das Formular gültig ist. Im Falle einer Einzelseiten-App müssen Sie, wenn Sie die gleiche Seite erneut laden, alles tun, was Sie in der request.method == "GET" getan haben, also geben Sie möglicherweise eine HTTPResponseRedirect zurück an die gleiche URL. In diesem Fall würde ich das Django-Nachrichtenframework betrachten und dem Kontext eine Nachricht hinzufügen, dass das Formular erfolgreich gesendet wurde und die Nachricht auf der neu geladenen Seite anzeigen (Sie sollten immer überprüfen, ob eine Nachricht trotzdem angezeigt wird, wenn Sie die Nachrichten verwenden Rahmen, so wird dies nicht den Fall brechen, wo Sie die Seite zum ersten Mal geladen werden)

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

+0

@DeltaG danke für die Korrektur meiner Formatierung :) – nkhumphreys

+0

:) Danke für die schnelle Antwort. Das hilft.Könntest du ein wenig mehr Informationen darüber geben, wie man den POST macht und was zurückkommt? – DeltaG

+0

@DeltaG die beiden Links im Original und bearbeiten sollte jetzt geben Sie alles, was Sie brauchen, um dies reibungslos funktioniert – nkhumphreys