2015-04-18 10 views
5

Obecnie pracuję nad dość prostym projektem django i mogę skorzystać z pomocy. To tylko prosty interfejs zapytań do bazy danych.Django zaznacz, jeśli pole wyboru jest zaznaczone

Obecnie jestem zakleszczony na zawężania wyszukiwania przy użyciu pola wyboru, przyciski radiowe itp

Problem mam jest dowiedzieć się, jak wiadomo, kiedy zostanie wybrany checkbox (lub wielokrotność). Mój kod do tej pory jest w następujący sposób:

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> 

moja obecna idea jest taka, że ​​ja sprawdzić, które Pola wyboru/przyciski radiowe są wybierane i zależności, które, tym Odpowiednie dane zostaną sprawdzone i wyświetlone w tabeli.

W szczególności: Jak sprawdzić, czy zaznaczono konkretne pola wyboru? i jak mogę przekazać tę informację na views.py

+0

Nie można wykonać Pythona w przeglądarce internetowej klienta i tak będzie trzeba użyć JavaScript do tego. –

Odpowiedz

14

radio Przyciski:

W kodzie HTML swojego radia przyciski, trzeba wszystkie związane z nimi wejść radiowych dzielić tę samą nazwę, mają predefiniowanego „wartość” atrybutu, a optymalnie, mają otaczający znacznik etykiety, tak:

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

Następnie w widoku, można spojrzeć w górę który został wybrany przez sprawdzenie wspólnego atrybutu "nazwa" w danych POST. Jego wartością będzie powiązany atrybut "wartość" tagu wejściowego HTML:

# views.py 
def my_view(request): 
    ... 
    if request.method == "POST": 
     display_type = request.POST.get("display_type", None) 
     if display_type in ["locationbox", "displaybox"]: 
      # Handle whichever was selected here 
      # But, this is not the best way to do it. See below... 

To działa, ale wymaga ręcznego sprawdzenia. Lepiej jest najpierw utworzyć formularz Django. Następnie Django zrobi te kontrole dla Ciebie:

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> 

widoki.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}) 

Checkboxes:

Checkboxes pracują tak:

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

Dalsze czytanie:

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

Wielkie dzięki za odpowiedź. Myślę, że będę musiał pracować z metodą checkboxe. Ale trochę rozumiem, jak z niego korzystać. Po trzeciej zagnieżdżonej instrukcji IF, jak dokładnie mam sprawdzić, które z pól wyboru są używane? Jeszcze raz dziękuję za odpowiedź i proszę daj mi znać, ponieważ jestem nowy w django :) – user3496101

+0

W przykładzie pola wyboru MyForm wyświetla pole wyboru z etykietą "Coś w prawdzie". W my_view(), request.POST ["something_truthy"] ma wartość True, jeśli to pole wyboru było zaznaczone, a False, jeśli nie. –

+0

Dzięki za odpowiedź! Rozumiem tę część teraz :) Mam też pytanie uzupełniające, jeśli możesz dać mi jakąś radę. Napisałem oryginalny post. Moje pytanie dotyczy filtrowania określonych kolumn, gdy szukałem tego w Google i nie mogę znaleźć tego, czego szukam. Dzięki jeszcze raz! – user3496101

5

w modelach:

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

w szablonie:

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

zakładając, że jesteś wysłanie formularza jako POST, wartości wybranych wyboru są w request.POST.getlist ('tag').

Na przykład:

<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" /> 

stwierdzić, czy zostały sprawdzone 1,4,

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

check_values ​​zawierają [1,4] (te wartości, które zostało zaznaczone)

+2

Ta odpowiedź ma zastosowanie tylko wtedy, gdy z formularzem jest powiązany model, co nie ma miejsca w pytaniu, które zostało zadane. –