2017-11-11 3 views
0

Ich bin neu in Django und ich lerne immer noch die Seile. Ich habe die folgende Vorlage, mit der der Benutzer mehrere Kontrollkästchen auswählen kann. Jetzt möchte ich, dass diese Optionen an einen neuen URL-Pfad übergeben werden, nachdem der Benutzer eine Schaltfläche gedrückt hat. Wenn ich das falsch mache, lassen Sie es mich wissen und geben Sie einen Vorschlag.Übergeben Sie mehrere Kontrollkästchen Auswahl in einer Vorlage zu einem Formular

<div class="container"> 

      <div class="row"> 
       <div class="col"> 
       <h3>Financial</h3> 

         <ul> 
         {% for app in fingrouplist %} 
         <li><input type="checkbox" name="request_reports" value ="{{app.report_id}}" > {{ app.report_name_sc }}</li> 
         {% endfor %} 
         </ul> 
       </div> 
       <div class="col"> 

Wie würde ich das Ergebnis meines Kontrollkästchen auf REPORT_ID zu einer neuen Form und habe es mit diesen Elementen gefüllt pre-pass nach meiner Eingabe Schlagen/Submit-Button.

</br></br> 
<input class="btn btn-primary" type="button" value="Request Access"> 

Unten ist meiner Meinung nach und wie Sie ich viel mehr grouplists sehen werden, die alle nutzen REPORT_ID und ich möchte alle sie an die Form weitergegeben werden, die auf der Grundlage dieser Kontrollkästchen erzeugt wird.

def profile(request): 
    owner = User.objects.get (formattedusername=request.user.formattedusername) 
    reportdetail = QVReportAccess.objects.filter(ntname = owner.formattedusername, active = 1).values('report_name_sc') 

    reportIds = QVReportAccess.objects.filter(ntname = owner.formattedusername).values_list('report_id', flat=True) 
    reportaccess = QvReportList.objects.filter(report_id__in= reportIds).values_list('report_name_sc', flat = True) 
    reportGroups = QVReportAccess.objects.filter(ntname = owner.formattedusername).values_list('report_group_id', flat=True) 
    reportlist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).exclude(active=0) 
    allreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 100) 
    bhreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 200) 
    cereportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 500) 
    finreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 600) 
    careportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 800) 
    pireportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 1100) 
    screportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 1200) 
    dssreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 1300) 
    psgreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 1400) 
    othreportgrouplist = QvReportList.objects.filter(~Q(report_id__in= reportIds)).filter(report_group_id = 99999) 


    print(reportdetail) 

    args = {'user':owner, 'applicationaccess':reportaccess, 'applicationlist':reportlist, 'bhgrouplist':bhreportgrouplist, 'cegrouplist':cereportgrouplist, 'fingrouplist':finreportgrouplist 
      , 'cagrouplist':careportgrouplist, 'pigrouplist':pireportgrouplist, 'scgrouplist':screportgrouplist, 'dssgrouplist':dssreportgrouplist, 'psggrouplist':psgreportgrouplist 
      , 'othgrouplist':othreportgrouplist, 'allgrouplist':allreportgrouplist} 

    return render(request, 'accounts/profile.html', args) 

Antwort

1

Hier ist ein Weg, um es mit JavaScript und JQuery AJAX zu tun, um die aktiven Kontrollkästchen, um einen Django-Backend übergeben (mit E-Mail-Adressen):

HTML:

{% for address in address_book %} 
    <div id="address_row_{{ address }}" class="address" 
     onclick="$(this).toggleClass('selected')> 
     {{ address }} 
    </div> {# YOU CAN CHANGE THESE TO CHECKBOXES OR WHATEVER #} 
{% endfor %} 

function sendEmails() { // REQUIRES A BUTTON OR TRIGGER 
    let addresses = []; 
    $('.address').each(function() { 
     if ($(this).hasClass('selected')) { 
      addresses.push(this.id.split('_')[2]); 
     } 
    }); 

    $.ajax({ 
     type: "POST", 
     url: "{% url ' ... ' %}", 
     data: {'addresses': JSON.stringify(addresses)}, 
     success: function (serverResponse_data) { 
      console.log('sendEmails success: ' + serverResponse_data); 
     }, 
     error: function (serverResponse_data) { 
        console.log('error:' + JSON.stringify(serverResponse_data).split(',').join('\n')); 
     } 
    }); 

views.py :

def ajax_email_to (Anfrage): wenn nicht() request.is_ajax: return Httpresponse ("Server-Antwort ajax_email_to, kein n ajax call. ')

str_addresses = request.POST.get("addresses", "missing") # THIS HAS TO MATCH THE DICT KEY IN YOUR FRONT 

if str_addresses != 'missing': 

    # DO YOU STUFF 

    return HttpResponse("SERVER RESPONSE SUCCESS") 

return HttpResponse("SERVER RESPONSE ERROR") 

Sie können zu jeder Antwort etwas hinzufügen, einschließlich Vorlage-Rendering; dann werden die Antworten auf dem Frontend von den entsprechenden Abschnitten im Ajax-Befehl behandelt.

+0

Muss ich Bibliotheken für Ajax oder Jquery hinzufügen? Gibt es einen effizienteren Weg mit nur Django und Formen? Ich sehe nicht, wo es die Form bevölkert. – student101

+1

Ja, Sie müssen die JQuery-Bibliothek einschließen. Mit dieser Übung verwenden Sie überhaupt keine django-Formulare, stattdessen verwenden Sie eine Ansicht. was ich posten werde. Möglicherweise müssen Sie weitere Schritte zur Verarbeitung des CSRF-Tokens ausführen. Das ist jedoch nicht zu schwer. Ich glaube, dass Dinge wie Front-End mit JS viel einfacher zu machen sind als eine Django-Form. Natürlich können Sie versuchen, beide –

+0

Ich habe Probleme, wenn der POST durch Drücken der Taste auf meiner Profilseite auftritt, ändert sich meine URL nicht Requestaccess. Ich sehe, dass die Post-Anfrage zu accounts/requestaccess geht, aber wenn ich versuche, die request.POST.get oder getlist zu drucken, ist es None oder eine leere Liste. Ich habe hier einen neuen Thread gestartet: https://stackoverflow.com/questions/47317352/ajax-call-not-being-passed-post-request-shows-as-none – student101

Verwandte Themen