2010-12-06 2 views
0

Я пытаюсь создать поле формы оценки, используя код jquery here До сих пор я работаю нормально, но мне нужно сделать, это передать URL-адрес на основе объекта, который я пытаясь оценить. См. Строку $.post("URL TO GO HERE", {rating: value}, function(db) - это код ниже. URL-адрес будет примерно /rating/object_id, где object_id будет pk объекта, который я хочу оценить. Каков наилучший способ передать идентификатор объекта, чтобы я мог его использовать. Должен ли я сначала передать его в RatingField, а затем передать его оттуда в StarWidget?Django - передать объект в пользовательское поле формы

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 

ответ

0

Я знаю, что встроенные поля сделаны таким образом, но это действительно не хорошая практика, чтобы встроить большое количество HTML или JS в коде Python. Вместо этого создайте отдельный фрагмент шаблона, который обрабатывается методом render поля. Вы можете передать идентификатор объекта для использования в шаблоне {% url %} или просто передать весь URL-адрес по телефону reverse.

+0

Спасибо за ответ. Можете ли вы привести мне пример того, как это сделать? – John 2010-12-06 13:46:32

Смежные вопросы