2013-06-26 2 views
0

J'utilise django.Je veux vérifier un radiobutton particulier dans certains groupes de radiobutton lorsque la page charge?

Ma page fonctionne comme ceci, Si je coche le bouton radio et clique sur soumettre. il redirige vers la même page avec des emplois redéfinis sur la base desquels les radiobuttons ont été vérifiés. Mon problème est after loading the page none of the radio buttons are checked.

Je veux vérifier le bouton radio qui sont vérifiés avant que je clique soumettre

Code

class MyHome(View): 
    filter_options=(
     (('exp','Jobs by Experience'), 
      (['l1','Less Than 1 year',0], 
       ['1b2','1 to 2 Years',0], 
       ['2b3','2 to 3 Years',0], 
       ['3b5','3 to 5 Years',0],)), 
     (('sal','Jobs by Salary'), 
      (['l1000','Less Than $1000',0], 
       ['1000b3000','$1000 to $3000',0], 
       ['3000b5000','$3000 to $5000',0])), 
     (('loc','Jobs by Location'), 
      (['che','Chennai',0], 
       ['ban','Banglore',0])), 
    )  
    def get(self, request): 
     from django.db.models import Q 
     jobs=Job.objects.all().order_by("-postdate") 
     c_radio=[] 
     if 'exp' in request.GET:pass 
     if 'sal' in request.GET: 
      fl=request.GET['sal'] 
      c_radio.append(fl) 
      if 'l' in fl: 
       #return HttpResponse(fl[1:]) 
       q1=Q(basicpay__lte=fl[1:]) 
       self.filter_options[1][1][0][2]=1   
       jobs=jobs.filter(q1) 
      elif 'b' in fl: 
       jobs=jobs.filter(basicpay__range=fl.split('b')) 
       self.filter_options[1][1][1][2]=1 
     if 'loc' in request.GET: 
      c_radio.append(request.GET["loc"]) 
      jobs=jobs.filter(gmaplocation__district__icontains=request.GET["loc"])    
      #[2][1][1] ['ban', 'Banglore', 0] 

     return render(request,'job/jobs.html',{"jobs":jobs,'fopts':self.filter_options,'c_radio':c_radio}) 

html

{% for opts in fopts %}   
     <div class="accordion-group"> 
      <div class="accordion-heading emp"> 
      <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapse{{ forloop.counter }}"><!--item 1--> 
       {{ opts.0.1 }} 
      </a> 
      </div> 
      <div style="height: 0px;" id="collapse{{ forloop.counter }}" class="accordion-body collapse"> 
      <div class="accordion-inner">     
       {% for opt in opts.1 %} 
       <label class="radio"> 
       <input type="radio" name="{{ opts.0.0 }}" value="{{ opt.0 }}"{% ifequal opt.0.2 1 %} checked{% endifequal %}> {{ opt.1 }}{{ opt.0.2 }} 
       </label> 
       {% endfor %} 
       <!--<label class="checkbox"> 
       <input type="checkbox" name="redefine"> Other 
       <input type="text" name="other"> 
       </label>--> 
      </div> 
      </div> 
     </div><!--/accordion-group--> 
     {% endfor %} 

mise à jour:

Cela a fonctionné pour moi:

class RedefineChoices(forms.Form): 
    CHOICES_EXP=(('l1','Less Than 1 year'), 
      ('1b2','1 to 2 Years'), 
      ('2b3','2 to 3 Years'), 
      ('3b5','3 to 5 Years'), 
      ) 
    CHOICES_SAL=(('l1000','Less Than $1000'), 
      ('1000b3000','$1000 to $3000'), 
      ('3000b5000','$3000 to $5000'), 
      ) 
    CHOICES_LOC=(('che','Chennai'), 
      ('ban','Banglore'),) 
    exp = forms.ChoiceField(choices=CHOICES_EXP, widget=forms.RadioSelect(),label='Jobs by Experience') 
    sal = forms.ChoiceField(choices=CHOICES_SAL, widget=forms.RadioSelect(),label='Jobs by Salary') 
    loc = forms.ChoiceField(choices=CHOICES_LOC, widget=forms.RadioSelect(),label='Jobs by Location')enter code here 
+0

Qu'avez-vous essayé? :) –

+0

J'ai stocké une variable dans views.py qui définit si le bouton radio est coché ou non, par exemple 0 dans '(['l1', 'Moins de 1 an', 0],' puis l'utilise dans un template comme '< input type = "radio" name = "{{opts.0.0}}" {% ifequal opt.0.2 1%} vérifié {% endifequal%} ' – suhailvs

Répondre

1

si je comprends bien, vous voulez permettre aux utilisateurs de modifier le contenu de la page, en fonction de quelques options que vous les montrer. Je ne vois pas encore ce que jQuery a à faire ici.

Pour afficher un formulaire avec des cases précédemment cochées, vous devez instancier le formulaire avec ces données. Identique à modifier les vues.

Par exemple, si j'ai forme suivante:

from django import forms 

class MyForm(forms.Form): 
    choice1 = forms.BooleanField(label='Choice A') 
    choice2 = forms.BooleanField(label='Choice B') 
    choice3 = forms.BooleanField(label='Choice C') 

Vu, j'instancier comme ceci:

form = MyForm(initial={'choice1': True} 

maintenant lors du rendu dans le modèle:

<form action="" method="post"> 
    {{form.as_table}} 
    <input type='submit' value='Submit'> 
</form> 

il montrera choice1 comme vérifié.

Comme vous pouvez le voir, aucun jQuery n'a été nécessaire.

Un peu plus de choses: vous ne pouvez pas stocker en vue les cases précédemment cochées. La vue est juste une fonction, et toutes ses variables sont locales. Recherchez la portée variable de Python pour comprendre ce que cela signifie. Si vous souhaitez enregistrer un choix, vous pouvez avoir un modèle qui gardera la trace des choix des utilisateurs, ou l'enregistrer en session, comme ceci:

if form.is_valid(): 
    request.session['user_choice']=form.cleaned_data 

De cette façon, vous pouvez utiliser request.session['user_choice'] comme données initiales à instancier la forme.

This post a une très bonne explication comment vérifier ce qui a été vérifié en utilisant jQuery.

De toute façon, il vous sera beaucoup plus facile d'avoir une vue différente pour chaque option, de cette façon le code sera plus simple, plus facile à maintenir et à tester. Et de cette façon vous pouvez montrer des boutons et non un formulaire, pas besoin de poster, valider, instancier.

+0

c'est génial. Je vais sûrement essayer. je veux dire créer des formes. merci pour la relecture – suhailvs