Domanda

Sto cercando di filtrare l'elenco degli utenti in Django usando un campo UserProfile ... Devo implementare un sistema di coda in cui i nuovi utenti vengono messi in coda fino a quando un amministratore non li approva.

Ho semplicemente aggiunto un campo booleano is_in_queue al mio modello UserProfile ... Tuttavia, quando ho visualizzato l'elenco utenti nella mia area di amministrazione, mi sono reso conto che non puoi filtrare l'elenco usando un modello esterno campo chiave (in questo caso, un campo di UserProfile)

Apparentemente, gli elementi list_display possono essere richiamabili ma list_filter non possono, quindi posso elencare SE un utente è in coda senza problemi, ma l'amministratore avrebbe scorrere l'intero elenco utenti per individuare quali sono nella coda che non ha senso ... Filtrare solo gli utenti che sono nella coda (usando userprofile.in_queue) sarebbe molto più pratico ...

Infine, ho pensato di aggiungere una vista personalizzata alla mia area di amministrazione che elenca solo l'utente nella coda, ma quella vista personalizzata non viene visualizzata nella pagina Indice dell'area di amministrazione e di mettere insieme un nuovo AdminSite solo per una nuova opzione di filtro sembra un po 'esagerata ...

Quindi, in sostanza, per riassumere: posso filtrare il mio elenco utenti in base a a Campo UserProfile? In caso contrario, posso aggiungere una vista personalizzata accessibile dalla prima pagina senza doverne creare una completamente nuova AdminSite solo per quello?

È stato utile?

Soluzione

Potresti dare un'occhiata all'utilizzo di un gestore personalizzato per admin_objects del tuo modello.

class UserAdminManager(models.AdminManager):
"""
Custom manager for the User model.
"""
def get_query_set(self):
    """
    Overwrites the get_query_set to only return Users in the queue.
    """
    return super(UserAdminManager, self).get_query_set().filter(userprofile__queue=True)

Sovrascrivendo il metodo get_query_set puoi filtrare i risultati. Quindi assegna questo alla proprietà admin_objects del tuo modello User .

admin_objects = UserAdminManager()

Alcuni dei nomi delle proprietà nel mio esempio potrebbero essere errati, poiché non conosco la configurazione del modello, ma spero che tu abbia l'idea.

Puoi effettuare ulteriori ricerche consultando i documenti di django e cercando "gestori personalizzati".

Altri suggerimenti

Django 1.3 ha risolto il problema: list_filter ora consente di estendere le relazioni:

https: // docs .djangoproject.com / it / 1.3 / ref / contrib / admin / # django.contrib.admin.ModelAdmin.list_filter

Mi sembra che l'opzione più semplice e veloce sia quella di aggiungere una nuova vista amministratore alla tua applicazione, in particolare per il tuo modello utente personalizzato. Vedi Django admin documents per i dettagli, sebbene sembra che tu sappia già come utilizzare Admin.

Una volta che la pagina di amministrazione è specifica per il tuo modello, tutti i campi personalizzati non saranno più chiavi esterne. Ciò renderebbe il filtraggio semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top