2009-01-31 9 views
11

Voglio costruire un sito django in cui un determinato gruppo di utenti fidati può modificare le informazioni del proprio profilo. Ha senso che ogni utente fidato passi attraverso l'interfaccia di amministrazione di django? Vorrei solo che fossero in grado di vedere e modificare le proprie informazioni (ovviamente). Non sembra come questo si inserisce il modo in cui la gente Django definiscono "fiducia", in particolare il bit in grassetto ...Valido caso d'uso per admin django?

Da The Django Book, Chapter 18:

L'amministratore è stato progettato per essere utilizzato da persone che ti , lo sviluppatore, fiducia. Questo non significa solo "persone che sono state autenticate " significa che Django presuppone che i tuoi editor siano affidabili per fare la cosa giusta .

Questo significa che non c'è processo di “approvazione” per l'editing di contenuti - se si fiducia agli utenti, nessuno ha bisogno di approvare delle loro modifiche. Significa anche che il sistema di autorizzazione, pur essendo potente , non ha alcun supporto per limitare l'accesso a per ogni oggetto. Se si si fidano di qualcuno per modificare le proprie storie , ci si fida di loro di non modificare di chiunque altro senza permesso.

È questo uno di quei casi d'uso che si adatta con il modulo di amministrazione di Django, o è solo una vista specializzata per un utente non attendibile?

risposta

17

No, l'amministratore di Django non è adatto per i singoli profili utente, ogni utente sarebbe in grado di vedere e modificare tutti gli altri profili utente. Questo è più adatto a un amministratore che deve gestire tutti gli utenti contemporaneamente.

Ciò che è necessario creare è una pagina del profilo utente. Django ha già un buon sistema di accesso per gentile concessione del modulo django.contrib.auth. Puoi facilmente integrarlo nelle tue pagine, ed è esattamente ciò che l'amministratore di Django usa per autenticare gli utenti.

Successivamente sarà necessario creare una pagina semplice che esponga le informazioni del profilo dell'utente specifico in base al modello utente. Questo dovrebbe essere relativamente indolore in quanto richiede solo una vista e un modello, e il modello può trarre vantaggio da ModelForms.

+2

È possibile limitare l'amministratore in modo da poter modificare solo il proprio profilo; ma non lo consiglierei per questo caso d'uso. +1 –

3

Non prenderei in considerazione la possibilità di modificare il mio profilo personale su un sito Web come attività amministrativa. Penso che lo django-profiles sia quello che stai cercando.

3

Il modello di autorizzazione di Django è un po 'troppo semplicistico. Si tratta solo di verificare l'autorizzazione sul Modello nel suo complesso.

Per questo tipo di cose, sei praticamente obbligato a scrivere le tue funzioni di visualizzazione che gestiscono il controllo aggiuntivo.

Dopo averne scritto uno o due, vedrai lo schema. Quindi puoi pensare di scrivere il tuo decoratore per gestire questo.

def profileView(request, object_id): 
    p= Profile.objects.get(id=int(object_id)) 
    if request.session['user'] != p.get_user(): 
     # respond with a 401 not authorized or a helpful message 
    # process normally, since the session['user'] is the user for the Profile. 

Per quanto sopra a lavorare, è necessario abilitare le sessioni, ed essere sicuri di registrare l'utente nella sessione quando il login con successo. Avrai anche bisogno di sradicare la sessione quando si disconnettono.

+0

Scrivere le proprie viste è un'opzione, e spesso una buona. Ma non sei "forzato" a. Le classi ModelAdmin di Django hanno hook di metodo (come "has_change_permission") che ti permettono di modificare il comportamento dell'amministratore in modi piuttosto importanti. –

+0

@Carl Meyer: has_x_permission è a livello di modello. È inoltre necessario convalidare la proprietà di ciascun oggetto, che non fa parte dei decoratori standard. Facile da aggiungere, ma pur sempre un'estensione. –

5

Si consiglia di creare un modello Persona che contenga OneToOneField sul modello Utente (modello Utente del sito di amministrazione). Alcuni cosa del genere ..

from django.contrib.auth.models import User 

    class Person(models.Model): 
     """The person class FKs to the User class and contains additional user information 
     including userImage, country, etc""" 

     user = models.OneToOneField(User, related_name='person_fk') 
     url = models.URLField(max_length=255, blank=True) 
     country = models.CharField(max_length=2, blank=True) 
     state = models.CharField(max_length=50, blank=True) 
     zipCode = models.IntegerField(max_length=7, blank=True, null=True) 
     userImage = models.ImageField(upload_to=generate_filename, blank=True, null=True) 
1

Solo per riferimento, ecco un snippet dimostrando come si può abbastanza facilmente ottenere questo effetto (gli utenti possono modificare solo i "propri" oggetti) in admin Django. Avvertenza: non consiglierei di farlo per i profili utente, sarà più facile e più flessibile creare semplicemente la propria vista di modifica usando un ModelForm.

1

Ci sono alcune app django che consentono permessi a livello di riga sul tuo modello di amministrazione. Tuttavia, sarei più propenso a scrivere il mio punto di vista che consente agli utenti di farlo dall'interno dell'applicazione.

Avevo aspirazioni simili (utilizzando il contributo di amministratore) durante la progettazione dell'app a cui sto lavorando attualmente, ma ho deciso che l'app di amministrazione è davvero per l'utilizzo da parte degli amministratori e che agli utenti regolari dovrebbero essere fornite le proprie pagine per eseguire lavoro e personalizzazione (se richiesto).

È possibile generare facilmente le viste CRUD per un modello particolare utilizzando viste e forme di modello generiche e basta applicare fogli di stile per un aspetto coerente con il resto dell'applicazione.