2011-10-15 5 views
10

Ho un modulo non amministratore in cui mi piacerebbe utilizzare filter_horizontal su. Ho letto this che fa molto più di quello che voglio (voglio solo il filter_horizontal). Volevo verificare se qualcuno ha ideato un modo più semplice (più attuale) per implementare semplicemente filter_horizontal.Che cosa è il modo più semplice per utilizzare filter_horizontal all'esterno dell'amministratore in Django

Quindi, ecco il codice:

class County(models.Model): 
    """County Names""" 
    name = models.CharField(max_length=64) 
    state = USStateField(null=True) 

class Company(models.Model): 
    """The basics of a company""" 
    name = models.CharField(max_length = 100) 
    counties = models.ManyToManyField(County,blank=True, null=True) 

Poi il nostro modulo attualmente simile a questa. Ho pensato che questo avrebbe funzionato ..

from django.contrib.admin.widgets import FilteredSelectMultiple 
class RaterCompanyForm(ModelForm): 
    class Meta: 
     model = RaterOrganization 
     exclude = ('remrate_projects',) 
     widgets = {'counties': FilteredSelectMultiple(verbose_name="Counties", 
                 is_stacked=True,) } 
    class Media: 
     css = {'all':['admin/css/widgets.css']} 
     js = ['/admin/jsi18n/'] 

BTW: Capisco che questo può essere un duplicato di this ma la sua domanda non ha avuto risposta. Ho fatto un sacco di compiti a casa here e here ma nessuno di questi sembra funzionare.

risposta

13

So che questo thread è vecchio, ma speriamo che queste informazioni possano aiutare qualcun altro che si imbatte in questa pagina come ho fatto io.

Dopo tanto dolore e sofferenza, sono riuscito a farlo funzionare con Django 1.4. Come rh0dium, ho provato tutti questi articoli, ma ho dovuto fare un sacco di modifiche.

Non devi fare nulla di speciale con la ModelForm, ma c'è bisogno di includere tutti questi js e file CSS nel modello:

<script type="text/javascript" src="/admin/jsi18n/"></script> 
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/core.js"></script> 
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/jquery.min.js"></script> 
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/jquery.init.js"></script> 
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/SelectFilter2.js"></script> 
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/SelectBox.js"></script> 

<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/widgets.css"/> 
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/base.css"/> 
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/forms.css"/> 

Poi rendere il modulo come si farebbe normalmente, ma è necessario ottenere gli elementi fieldset e i nomi delle classi giusti affinché il css funzioni. Per esempio:

<fieldset> 
    <div class="form-row"> 
     <form method="post" action="."> 
      {% csrf_token %} 
      {{ form.as_p }} 
     <button type="submit" value="submit">Add</button> 
    </form> 
    </div> 
</fieldset> 

Poi in fondo del modello (dopo il markup per rendere la forma), aggiungere questo script e sostituire pricetags con qualunque sia il vostro molti a molti (M2M) nome della relazione è sul modello del modello di formulario :

<script type="text/javascript"> 
    addEvent(window, "load", function(e) { SelectFilter.init("id_pricetags", "pricetags", 0, "{{ STATIC_URL }}admin/"); }); 
</script> 

a quanto pare la posizione di supporto può essere qualcosa di diverso, ma {{}} STATIC_URL admin/lavorato per me.

+0

È possibile modificare lo 0 in un 1 nella chiamata SelectFilter.init per renderlo verticale anziché orizzontale. – SuperFunkyMonkey

+0

usa '{% admin_media_prefix%}' invece di '{{STATIC_URL}}' – est

+0

Solo questo ha funzionato per me '' – eosimosu