2012-09-08 10 views
14

Newbie Domanda Django: Mi piacerebbe che l'amministratore di Django visualizzasse più file di scelte nel widget a selezione multipla. Ho una lista estremamente lunga da cui selezionare e le 4 righe predefinite non sono convenienti, specialmente quando si scorre.Overriding Size di Django Admin Multi-select Widget

In questo momento, quel widget è reso come selezionare più ma mi piacerebbe che fosse selezionare formato multiplo = "12". Idealmente questo dovrebbe essere per campi specifici, ma posso vivere con tutti i campi di rendering con lo stesso attributo di dimensione.

Quindi dove sarebbe il posto ottimale in Django per cambiarlo?

risposta

13

Se si dispone di una selezione lunga che continuerà a crescere, si consiglia di utilizzare un autocomplete widget.

In ogni caso, si potrebbe:

  1. Create a ModelForm, per il modello in questione

  2. Override the default widget, per il settore in questione,

  3. Set widget's size attribute al tuo ha bisogno di

  4. Enable that form in ModelAdmin, ad esempio

    class YourModelForm(forms.ModelForm): 
        class Meta: 
         model = YourModel 
         widgets = { 
          'your_field': forms.SelectMultiple(attrs={'size': 12}) 
         } 
    
    
    class YourModelAdmin(admin.ModelAdmin): 
        form = YourModelForm 
    
19

ho fatto questo nel admin.py impostando una dimensione coperta per tutti gli elementi ManyToManyField, per esempio:

from django.contrib import admin 
from django.forms import SelectMultiple 
from django.db import models 
from models import * 

class RiverAdmin(admin.ModelAdmin): 
    formfield_overrides = { models.ManyToManyField: {'widget': SelectMultiple(attrs={'size':'10'})}, } 

admin.site.register(River, RiverAdmin) 
+0

+1 per semplicità – JeffC

+2

noti che questa non funziona se '' filter_horizontal' o filter_vertical' è impostata per i campi corrispondenti 'RiverAdmin'. Ho passato un po 'di tempo per capirlo. –

0

I è stato in grado di fare il numero di righe in base al numero iniziale di righe della tabella correlate, tuttavia non si aggiorna dinamicamente (probabilmente è necessario inserire Javascript nell'admin per m e query numero di righe tramite AJAX, che sarebbe troppo grande per postare qui).

class ProfileAdminForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = '__all__' 
     widgets = { 
      # Will dynamically change number of rows in select multiple, however only after server reload. 
      'spec_profiles': forms.SelectMultiple(attrs={'size': SpecProfile.objects.count()}) 
     } 

class ProfileAdmin(admin.ModelAdmin): 
    form = ProfileAdminForm