2010-12-06 6 views
0

J'essaie de créer un champ de formulaire de notation en utilisant le code jquery here Jusqu'à présent, je l'ai bien fonctionner, mais ce que je dois faire est de passer dans une URL basée sur l'objet que je suis essayant de noter. Voir la ligne $.post("URL TO GO HERE", {rating: value}, function(db) est le code ci-dessous. L'URL serait quelque chose comme /rating/object_id où object_id serait le pk de l'objet que je veux évaluer. Quel est le meilleur moyen de transmettre un identifiant d'objet pour pouvoir l'utiliser. Aurais-je besoin de le passer d'abord à RatingField, puis de le transmettre à StarWidget?Django - Passer l'objet dans le champ de formulaire personnalisé

class StarWidget(widgets.Select): 
    """ 
    widget to show stars which the user can click on to rate 
    """ 
    class Media: 
     css = { 
      'all': ('css/ui.stars.css',) 
     } 
     js = ('js/ui.stars.js',) 

    def render(self, name, value, attrs=None): 
     output = super(StarWidget, self).render(name, value, attrs) 

     jquery = u""" 
     <div id="stars-rating" class="rating_section"> 
      %s 
      <span id="caption"></span> 
     </div> 
     <script type="text/javascript"> 
     $(function(){ 
      $("#stars-rating").stars({ 
       inputType: "select", 
       captionEl: $("#caption"), 
       cancelShow: false, 
       callback: function(ui, type, value) 
       { 
        // Hide Stars while AJAX connection is active 
        $("#stars-rating").hide(); 
        $("#loader").show(); 
        $.post("URL TO GO HERE", {rating: value}, function(db) 
        { 
         $("#loader").hide(); 
         $("#stars-rating").show(); 
        }, "json"); 
       } 
      }); 
     }); 
     </script> 

     """ % (output) 

     return mark_safe(jquery) 

class RatingField(forms.ChoiceField): 
    """ 
    rating field. changes the widget and sets the choices based on the model 
    """ 
    widget = StarWidget 

    def __init__(self, *args, **kwargs): 
     super(RatingField, self).__init__(*args, **kwargs) 

     self.label = "Rating:" 
     self.initial = 3 
     self.choices = Rating.RATING_CHOICES 

Répondre

0

Je sais que le fait sont des champs intégrés de cette façon, mais il est vraiment pas une bonne pratique d'intégrer de grandes quantités de HTML ou JS dans le code Python. Au lieu de cela, créez un fragment de modèle séparé qui est rendu par la méthode render du champ. Vous pouvez transmettre l'ID de l'objet à utiliser dans la fonction de modèle {% url %}, ou simplement transmettre l'URL complète via appel au reverse.

+0

Merci pour la réponse. Pouvez-vous me donner un exemple de comment faire cela? – John

+0

Je ne sais pas exactement comment je peux créer un fragment de gabarit séparé rendu par la méthode de rendu du champ. Je sais comment créer le fragment mais je ne sais pas comment le rendre rendu par la fonction de rendu du widget. – John

+0

@John: voir la section 'Rendu d'un template' dans le livre de Django: http://www.djangobook.com/en/beta/chapter04/ –

Questions connexes