2011-09-01 3 views
1

J'utilise django-selectable (https://bitbucket.org/mlavin/django-selectable) avec un administrateur tabularInline pour obtenir la fonctionnalité de saisie semi-automatique sur l'un des champs en ligne. Cela fonctionne pour les inlines ajoutés au moment de la création. Le problème que j'ai est que la fonctionnalité de saisie semi-automatique n'est pas ajoutée lorsque l'utilisateur ajoute une autre ligne à l'en ligne.Django-sélectionnable avec des inlines dynamiques

Il y a un bug et correctif pour ce problème ici

https://bitbucket.org/mlavin/django-selectable/issue/12/make-it-work-with-dynamically-added-forms Et regardant jquery.dj.selectable.js près du fond est:

if (typeof(django) != "undefined" && typeof(django.jQuery) != "undefined") { 
    if (django.jQuery.fn.formset) { 
     var oldformset = django.jQuery.fn.formset; 
     django.jQuery.fn.formset = function(opts) { 
      var options = $.extend({}, opts); 
      var addedevent = function(row) { 
       bindSelectables($(row)); 
      }; 
      var added = null; 
      if (options.added) { 
       var oldadded = options.added; 
       added = function(row) { oldadded(row); addedevent(row); }; 
      } 
      options.added = added || addedevent; 
      return oldformset.call(this, options); 
     }; 
    } 
} 

On dirait que cela devrait rendre le travail de saisie semi-automatique avec des lignes ajoutées dynamiquement, mais je ne peux pas savoir quoi faire pour que cela fonctionne. L'administrateur tabularInline.html a inline_admin_formset alors devrais-je vérifier cela et pas django.jQuery.fn.formset comme dans le code ci-dessus? Ou en quelque sorte en ajoutant inline_admin_formset à django.jQuery.fn?

Merci beaucoup pour vos suggestions.


J'utilise la version 0.2. En forms.py il y a la forme en ligne:

class GrammarInlineForm(forms.ModelForm): 
     class Meta: 
      model = Grammar 
      widgets = { 
      'description' :forms.Textarea(attrs={'cols': 80, 'rows': 10, 'class': 'grammarInline'}), 
      'title' : selectable.AutoCompleteSelectWidget(lookup_class=GrammarLookup, allow_new=True), 
     } 
     exclude = ('creation_date', 'creator', 'plan') 

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

Dans admin.py l'administration en ligne est fait et a ajouté à l'administrateur principal (PlanAdmin):

class GrammarInline(admin.TabularInline): 
     form = GrammarInlineForm 
     model = Grammar 
     extra = 2 

     def save_formset(self, request,form, formset, change): 
      instances = formset.save(commit=False) 
      for instance in instances: 
       instance.creator = request.user 
       instance.save() 
      formset.save_m2m() 

    class PlanAdmin(admin.ModelAdmin): 
     form = PlanForm 
     list_display = ('title', 'topic', 'level', 'description','public',) 
     inlines = [ ActivityInline, GrammarInline, ] 

Après avoir lu votre billet http://code.djangoproject.com/ticket/15760 I essayé liaison aux inline événement formsetadd, comme celui-ci

django.jQuery('.ui-autocomplete-input').live('formsetadd', function(e, row) { 
     console.log('Formset add!'); 
     console.log($(row)); 
     }); 

mais regardant django/contrib/admin/media/js/inlines.js il semble que ces déclencheurs ne sont pas dans la version 1.3.1 de django. Est-il nécessaire de lier à un événement qui est déclenché quand un inline est ajouté? Il y a un cas similaire ici https://bitbucket.org/mlavin/django-selectable/issue/31/dynamically-added-forms mais cela utilise le plugin formset. Existe-t-il un moyen d'utiliser bindSelectable (ligne) pour l'administrateur en ligne?

+0

Vous ne devriez pas avoir à faire quoi que ce soit pour faire ce travail. Quelle version utilisez vous? –

Répondre

0

Le code jquery.dj.selectable.js que vous avez posté est là pour corriger le django/contrib/admin/media/js/inlines.js pour appeler bindSelectable(row) lorsqu'une nouvelle ligne est ajoutée. http://code.djangoproject.com/ticket/15760 a été ouvert pour que ce patch de singe ne soit pas nécessaire mais n'a pas été fermé et ne sera probablement pas fermé pour Django 1.4. Encore une fois, vous ne devriez pas avoir besoin de faire quoi que ce soit pour que cela fonctionne. Vous n'avez pas besoin de changer le modèle. Vous n'avez pas besoin d'écrire de JS supplémentaire.

La source de projet a un exemple de travail d'utiliser une ligne de tableau dynamique: https://bitbucket.org/mlavin/django-selectable/src/33e4e93b3fb3/example/core/admin.py#cl-39

+0

OK, merci. Dans le cas où cela aide, le problème a été résolu en ajoutant bindSelectables ('row') à la fonction onAfterAdded dans le tabular.html. – Rory

+0

Oui cela fonctionnera mais c'est exactement ce que j'essayais d'éviter lorsque j'ai écrit ce correctif. Encore une fois s'il vous plaît noter que «admin/edit_inline/tabular.html» n'est pas modifié dans le projet d'exemple encore les inlines dynamiques fonctionnent (pour moi au moins). –

Questions connexes