2015-04-18 15 views
5

Ich arbeite gerade an einem ziemlich einfachen Django Projekt und könnte etwas Hilfe gebrauchen. Es ist nur ein einfaches Datenbankabfrage-Frontend.Django check wenn Checkbox ausgewählt ist

Derzeit bin ich stecken die Suche mit Kontrollkästchen auf die Verfeinerung, Radio-Buttons usw.

Das Problem, das ich habe, ist, herauszufinden, wie zu wissen, wann eine Checkbox (oder mehrere) ausgewählt ist. Mein Code so weit ist als solche:

views.py

def search(request): 
    if 'q' in request.GET: 
     q = request.GET['q'] 
     if not q: 
      error = True; 
     elif len(q) > 22: 
      error = True; 
     else:   
      sequence = Targets.objects.filter(gene__icontains=q) 
      request.session[key] = pickle.dumps(sequence.query) 
      return render(request, 'result.html', {'sequence' : sequence, 'query' : q, 'error' : False})  
    return render(request, 'search.html', {'error': True}) 

search.html

<p>This is a test site</p></center> 

     <hr> 
     <center> 
      {% if error == true %} 
       <p><font color="red">Please enter a valid search term</p> 
      {% endif %} 
     <form action="" method="get"> 
      <input type="text" name="q"> 
      <input type="submit" value="Search"><br>    
     </form> 
     <form action="" method="post"> 
      <input type='radio' name='locationbox' id='l_box1'> Display Location 
      <input type='radio' name='displaybox' id='d_box2'> Display Direction 
     </form> 
     </center> 

Meine aktuelle Idee ist, dass ich überprüfen, welche Kontrollkästchen/Optionsfelder ausgewählt sind und je, die sind, die Rechte Daten werden abgefragt und in einer Tabelle angezeigt.

So speziell: Wie überprüfe ich, ob bestimmte Kontrollkästchen aktiviert sind? und wie gebe ich diese Informationen auf views.py

+0

Sie können nicht Python ausführen auf den Web-Browser des Clients und so werden Sie JavaScript für diese verwenden müssen. –

Antwort

14

Tasten:

Im HTML für Ihr Radio Tasten, müssen Sie alle zugehörigen Funk Eingänge den gleichen Namen, einen vordefinierten „value“ Attribut, und in optimaler Weise zu teilen, eine umgebende Label-Tag haben, wie folgt aus:

<form action="" method="post"> 
    <label for="l_box1"><input type="radio" name="display_type" value="locationbox" id="l_box1">Display Location</label> 
    <label for="d_box2"><input type="radio" name="display_type" value="displaybox" id="d_box2"> Display Direction</label> 
</form> 

Dann Ihrer Ansicht nach können Sie nachschlagen welches ausgewählt wurde, indem nach dem gemeinsamen Attribut "name" in den POST-Daten gesucht wurde. Sein Wert ist das zugeordnete "value" -Attribut des HTML-Eingabe-Tags:

Das funktioniert, aber es erfordert manuelle Prüfungen. Es ist besser, zuerst ein Django-Formular zu erstellen. Dann wird Django diese Kontrollen für Sie tun:

forms.py:

from django import forms 

DISPLAY_CHOICES = (
    ("locationbox", "Display Location"), 
    ("displaybox", "Display Direction") 
) 

class MyForm(forms.Form): 
    display_type = forms.ChoiceField(widget=forms.RadioSelect, choices=DISPLAY_CHOICES) 

your_template.html:

<form action="" method="post"> 
    {# This will display the radio button HTML for you #} 
    {{ form.as_p }} 
    {# You'll need a submit button or similar here to actually send the form #} 
</form> 

Ansichten.py:

from .forms import MyForm 
from django.shortcuts import render 

def my_view(request): 
    ... 
    form = MyForm(request.POST or None) 
    if request.method == "POST": 
     # Have Django validate the form for you 
     if form.is_valid(): 
      # The "display_type" key is now guaranteed to exist and 
      # guaranteed to be "displaybox" or "locationbox" 
      display_type = request.POST["display_type"] 
      ... 
    # This will display the blank form for a GET request 
    # or show the errors on a POSTed form that was invalid 
    return render(request, 'your_template.html', {'form': form}) 

Ankreuzfelder:

Ankreuzfelder wie diese Arbeit:

forms.py:

class MyForm(forms.Form): 
    # For BooleanFields, required=False means that Django's validation 
    # will accept a checked or unchecked value, while required=True 
    # will validate that the user MUST check the box. 
    something_truthy = forms.BooleanField(required=False) 

views.py:

def my_view(request): 
    ... 
    form = MyForm(request.POST or None) 
    if request.method == "POST": 
     if form.is_valid(): 
      ... 
      if request.POST["something_truthy"]: 
       # Checkbox was checked 
       ... 

Weiterführende Literatur:

https://docs.djangoproject.com/en/1.8/ref/forms/fields/#choicefield

https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#radioselect

https://docs.djangoproject.com/en/1.8/ref/forms/fields/#booleanfield

+0

Vielen Dank für die Antwort. Ich denke, ich muss mit der Checkbox-Methode arbeiten. Aber ich habe ein wenig Verständnis, wie man es benutzt. Wie gehe ich nach der dritten verschachtelten IF-Anweisung vor, um zu prüfen, welche der Checkboxen verwendet werden? Nochmals vielen Dank für die Antwort, und bitte tragen Sie mich, wie ich neu bei Django bin :) – user3496101

+0

In der Checkbox Beispiel MyForm rendert ein Kontrollkästchen mit der Bezeichnung "Etwas truthy". In my_view() ist request.POST ["something_truthy"] True, wenn dieses Kontrollkästchen aktiviert wurde, und False, wenn nicht. –

+0

Danke für die Antwort! Ich verstehe diesen Teil jetzt :) Ich habe auch Follow-up-Frage obwohl wenn Sie mir vielleicht einen Rat geben könnten. Ich habe den ursprünglichen Beitrag verbessert. Meine Frage bezieht sich auf das Filtern bestimmter Spalten, da ich bei Google danach gesucht habe und nicht finden kann, wonach ich suche. Danke noch einmal! – user3496101

5

Bei den Modellen:

class Tag: 
    published = BooleanField() 
    (...) 

In der Vorlage:

{% for tag in tags %} 
<label class="checkbox"> 
    <input type="checkbox" name="tag[]" value="" {% if tag.published %}checked{% endif %}> 
</label> 
{% endfor %} 

Angenommen, Sie das Formular als POST senden, um die Werte des ausgewählten Kontrollkästchen sind in request.POST.getlist ('tag').

Zum Beispiel:

<input type="checkbox" name="tag[]" value="1" /> 
<input type="checkbox" name="tag[]" value="2" /> 
<input type="checkbox" name="tag[]" value="3" /> 
<input type="checkbox" name="tag[]" value="4" /> 

sagen, wenn 1,4, geprüft wurden

check_values = request.POST.getlist('tag') 

check_values ​​enthält [1,4] (die Werte, die überprüft wurden) Radio

+2

Diese Antwort ist nur anwendbar, wenn dem Formular ein Modell zugeordnet ist, was in der gestellten Frage nicht der Fall ist. –

Verwandte Themen