2016-05-20 13 views
0

Ich habe eine Tabelle. Eine der Spalten ist eine Ankreuzfeldspalte, und ich möchte, dass das Formular gesendet wird, wenn das Kontrollkästchen "Checked" eines Kontrollkästchens geändert wird.Django - ein Formular Eingabefeld wird nicht gebucht

Ich habe dem Formular auch ein ausgeblendetes Eingabefeld hinzugefügt, damit ich feststellen kann, welches Kontrollkästchen sich geändert hat.

Ich habe es geschafft, das Formular zu erhalten, wenn ein Checkbox-Status geändert wird (mit JQuery), aber aus irgendeinem Grund wird das versteckte Eingabefeld nicht mitgeschickt.

Das einzige Ding in request.POST in der Ansicht ist das csrf-Token.

<table class="bordered striped centered responsive-table"> 
      <thead> 
       <tr> 
        <th data-field="season">Season</th> 
        <th data-field="episode">Episode</th> 
        <th data-field="title">Title</th> 
        <th data-field="date">Air Date</th> 
        <th data-field="watched">Watched</th> 
       </tr> 
      </thead> 
      <tbody> 
       {% for episode in episodes %} 
        <tr> 
         <td>{{ episode.season }}</td> 
         <td>{{ episode.number }}</td> 
         <td>{{ episode.title }}</td> 
         <td>{{ episode.date }}</td> 
         <td><form id='episodes' action="" method="post" enctype="multipart/form-data"> 
          {% csrf_token %} 
          <input type="hidden" id="episode_title" value="{{ episode.title }}"/> 
          <input type="checkbox" id="{{ episode.title }}" {% if episode.watched %}checked="checked" {% endif %}/> 
          <label for="{{ episode.title }}"></label> 
          </form> 
         </td> 
        </tr> 
       {% endfor %} 
      </tbody> 
     </table> 

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("#episodes").on("change", "input:checkbox", function(){ 
     $("#episodes").submit(); 
    }); 
}); 
</script> 

EDIT I Tried @bfrederi ‚s Vorschlag. Hat sich nicht viel geändert. Das Formular wird nur mit dem csrf-Token gepostet.

<td><form id='episodes-{{ episode.title }}' action="" method="post" enctype="multipart/form-data"> 
         {% csrf_token %} 
         <input type="hidden" id="episode_title" value="{{ episode.title }}"/> 
         <input type="checkbox" class="episode-check" id="{{ episode.title }}" {% if episode.watched %}checked="checked" {% endif %}/> 
         <label for="{{ episode.title }}"></label> 
         </form></td> 

. 
. 

$(document).ready(function(){ 
    $(".episode-check").change(function() { 
     this.closest('form').submit(); 
    }); 
}); 

Antwort

0

Ok, also ging ich mit einem ganz anderen Ansatz, der für mich arbeitet, als eine Antwort für zukünftige Generationen Posting :)

Was ich tat, war eine neue URL zu erstellen, um es zu, anstatt zu der der Entsendung gleiche URL
Dann biete ich einfach nur mehr Parameter für die Post-Funktion aus meiner Sicht.

So sind die 2 Urls für die gleiche Ansicht:

url(r'^show/(?P<show_name>.+)/episodes', ShowDetail.as_view(), name='show-detail'), 
url(r'^show/(?P<show_name>.+)-(?P<episode_season>\d+)-(?P<episode_number>\d+)', 
    ShowDetail.as_view(), name='show-detail-update') 

dann auf der Seite poste ich einfach in die neu geschaffene url:

<td><form id='episodes-{{ episode.title }}' action="{% url 'shows_app:show-detail-update' show_name episode.season episode.number %}" method="post"> 
          {% csrf_token %} 
          <input type="checkbox" class="episode-check" id="{{ episode.title }}" {% if episode.watched %}checked="checked" {% endif %}/> 
          <label for="{{ episode.title }}"></label> 
    </form> 
</td> 

Und die Ansicht selbst:

class ShowDetail(View): 
    def get(self, request, show_name): 
     # handling the get request 

    def post(self, request, show_name, episode_season, episode_number): 
     # handling the post request 
     # referring the user the the same page 
     return self.get(request, show_name) 

Es fühlt sich immer noch an wie ein Hack, aber es funktioniert.

Wenn jemand einen besseren Vorschlag hat, würde ich mich freuen, es zu hören.

+0

Das ist nur eine Vermutung, aber wenn man sich die Unterschiede in den Vorlagen ansieht, könnte es sein, dass Sie kein * angegeben haben. * Aktion ** in Ihrer ursprünglichen Vorlage (abhängig von Ihrem Browser). Es empfiehlt sich, immer eine relative/absolute URL in der ** Aktion ** anzugeben (wie in dieser Antwort). – bfrederix

+0

Oder, vielleicht eher, könnte es sein, wie Django Ihr mehrteiliges Formular erhalten hat: https://docs.djangoproject.com/en/1.9/ref/forms/api/#testing-for-multipart-forms – bfrederix

1

Erste, haben Sie mehrere Formulare mit derselben ID erstellt:

<form id='episodes' action="" method="post" enctype="multipart/form-data"> 

Sie bilden ids verzichten kann vollständig und verwenden Sie einen JQuery class selector:

<input type="checkbox" class="episode-check" {% if episode.watched %}checked="checked" {% endif %}/> 

und

$(".episode-check").change(function() { 
    this.closest('form').submit(); 
} 

... um auf das übergeordnete Formularelement zuzugreifen like so. Rufen Sie dann submit auf dem richtigen Formular auf (Sie sollten immer noch eindeutige IDs haben, wenn Sie Ihre Formular-IDs angeben).

+0

Danke, ich sehe das Problem von mehreren Formularen mit der gleichen ID. Wenn ich jedoch jedem eine andere ID geben würde, welche ID würde die JQuery für das Senden und Abhören von Änderungen benötigen? – DeepSpace

+0

Sie möchten Ihren Selektor ändern, um Klassen anstelle von IDs für onChange zu verwenden. Dann greifen Sie auf das übergeordnete Formular zu, wie in dem von mir bereitgestellten Link erläutert. – bfrederix

+0

Ich habe Ihren Vorschlag ausprobiert, aber 'request.POST' enthält immer noch nur das csrf-Token. Ich habe nach Frage mit dem aktuellen Code aktualisiert. – DeepSpace

0

Sie könnten auf this link verweisen, um zu verstehen, wie HTML-Elemente verarbeitet und durch das Anfrageobjekt übergeben werden.

Verwandte Themen