2010-09-23 13 views
17

Ho un'applicazione in Django con una routine che sarebbe disponibile solo per l'amministratore. Quello che voglio fare è aggiungere un pulsante per eseguire la routine nella sezione dell'applicazione dell'app dell'amministratore.Aggiungere un pulsante personalizzato alla pagina di amministrazione di un'applicazione Django

Devo fare un modello per questo, e se questo è il caso, come faccio ad aggiungere un modello html per un'app nell'amministratore. O forse c'è un comando per aggiungere semplicemente un pulsante?

+1

perché non creare una pagina separata che richiede un login amministratore? Questo è spesso più semplice che fare casino con la pagina di amministrazione. –

+0

Un'alternativa distante al pulsante personalizzato è azioni di amministrazione https://docs.djangoproject.com/en/1.10/ref/contrib/admin/actions/ – Wtower

risposta

13

La messaggistica con i moduli di amministrazione può essere complicata, ma ho trovato comunemente che l'aggiunta di collegamenti, pulsanti o informazioni aggiuntive è facile e utile. (Come una lista di collegamenti ad oggetti correlati senza fare un inline, esp per cose che sono più viste che modificate).

Da Django docs

Grazie alla struttura modulare dei modelli di amministrazione, è di solito necessario né consigliabile sostituire un intero modello. È quasi sempre meglio sostituire solo la sezione del modello che è necessario modificare .

Questo aggiungerà un elenco nella parte superiore del modulo.

Luogo in templates/admin/[your_app]/[template_to_override]:

{% extends "admin/change_form.html" %} 

{% block form_top %} 

{% for item in original.items %} 
    {{ item }} 
{% endfor %} 

{% endblock %} 
-26

Non scherzare con le pagine di amministrazione.

  1. Creare una "applicazione" per questo. Sì, la tua funzione è solo una "routine". Va bene. Molte applicazioni più piccole sono una buona cosa.

  2. Questa applicazione non ha nulla di nuovo in models.py. Nessun nuovo modello. Zero righe di codice.

  3. Questa applicazione ha un utile URL in urls.py. Qualcosa che può essere utilizzato per visualizzare questa pagina di amministrazione. Un URL Non molte righe di codice (meno di una dozzina.)

  4. Questa applicazione ha una funzione di visualizzazione in views.py. In "GET", questa funzione di visualizzazione presenta la forma. Su "POST", questa funzione di visualizzazione fa la "routine". Questo è il "cuore" della tua applicazione. Il GET - ovviamente - restituisce semplicemente il modello per la visualizzazione. Il POST fa il vero lavoro e restituisce uno stato finale o qualcosa del genere.

Questa funzione di visualizzazione è protetta con un decoratore in modo che solo un amministratore possa eseguirlo. Vedere http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test. Vuoi scrivere un test per essere un amministratore. lambda u: u.is_staff è probabilmente.

  1. Questa applicazione ha un modello, presentato da GET e POST. Quel modello ha il tuo modulo con il tuo pulsante. Quello che non puoi aggiungere facilmente all'amministratore.

  2. Il tests.py è un test case con due utenti, uno che è un amministratore e uno che non è un amministratore.

Nessun problema con le pagine di amministrazione integrate.

+4

Anche quando si crea una nuova applicazione, quell'applicazione ha la possibilità di avere pagine di amministrazione associate per i suoi modelli. Così dicendo "basta creare una nuova app" manca completamente il punto. – Cerin

+1

@Cerin: "Così dicendo" basta creare una nuova app "manca completamente il punto". Forse. Potresti fornire una risposta che non manchi del tutto del tutto? –

+0

@Cerin Qual è la risposta accettata? – Yang

2

È inoltre possibile utilizzare django-admin-tools, che consente di personalizzare facilmente la prima pagina di amministrazione come un cruscotto. Utilizzando una LinkList, puoi puntare a un metodo di visualizzazione e verificare se l'utente è autenticato. Va come Thies:

# dashboard.py (read more about how to create one on django-admin-tools docs) 
class CustomIndexDashboard(Dashboard): 
    """ 
    Custom index dashboard for captr. 
    """ 
    def init_with_context(self, context): 
     self.children.append(modules.LinkList(
      _('Tasks'), 
      children=[ 
       ['Your task name', '/task'] 
      ] 
     )) 

# urls.py (mapping uri to your view function) 
urlpatterns += patterns('yourapp.views', 
    (r'^task$', 'task'), 
) 

# views.py 
def task(request): 
    if request.user.is_authenticated(): 
     update_definitions_task.delay() # do your thing here. in my case I'm using django-celery for messaging 

    return redirect('/admin') 
10

Django1.10:

1) Override admin/submit_line.html:

{% load i18n admin_urls %} 
<div class="submit-row"> 
{% if extra_buttons %} 
    {% for button in extra_buttons %} 
     {{ button }} 
    {% endfor %} 
{% endif %} 
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %} 
{% if show_delete_link %} 
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} 
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p> 
{% endif %} 
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %} 
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %} 
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %} 
</div> 

Ciò presuppone, naturalmente, che button s' rappresentazione di stringa è un browser appropriato input o button elemento ed è contrassegnato come sicuro con django.utils.safestring.mark_safe. In alternativa, è possibile utilizzare il filtro modello safe o accedere direttamente agli attributi di button per creare <input>. A mio parere, è meglio isolare tali cose a livello di python.

2) Override MyModelAdmin.change_view:

def change_view(self, request, object_id, form_url='', extra_context=None): 
    extra_context = extra_context or self.extra_context() 
    return super(PollAdmin, self).change_view(
     request, object_id, form_url, extra_context=extra_context, 
    ) 

Questo metodo consente di aggiungere pulsanti a qualsiasi ModelAdmin facilmente. In alternativa al passaggio (1), è possibile estendere admin/change_form.html e sostituire il blocco submit_row. Ciò sarebbe leggermente più prolisso a causa dei tag extra richiesti nel modello.

Se si desidera che l'azione aggiuntiva sia disponibile su tutti i modelli (o sottoinsiemi specifici), sottoclasse ModelAdmin con la funzionalità desiderata (un esempio potrebbe essere l'aggiunta di archiviazione ai modelli. È anche possibile aggiungere un override per eliminare- -e gli altri pulsanti predefiniti - in modo che la modalità sia archiviata anziché eliminata, ciò richiederebbe alcune modifiche al modello)

+2

Dovrebbe essere una risposta accettata. –

0

Si potrebbe considerare l'aggiunta di un'azione di amministrazione personalizzata per questo tipo di oggetto (simile al built-in 'cancella'), se appropriato. Alcuni vantaggi includono: "puro Django", non dovendo pasticciare con i modelli e poter agire su più oggetti contemporaneamente.

di amministrazione di Django permette di scrivere e registrare “azioni” - semplici funzioni che vengono chiamati con un elenco di oggetti selezionati sulla pagina di elenco cambiamento. Se guardi una qualsiasi lista di modifiche nell'amministratore, ti verrà mostrato il valore di ; Django viene fornito con un'azione "elimina selezionati oggetti " disponibile per tutti i modelli.

https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

ho avuto l'idea da questo articolo su come aggiungere un pulsante di azione personalizzato, che è un'altra risposta tutti insieme. Sono riuscito comunque a cavartela con le azioni integrate più semplici.

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-django-admin-8d266f5b0d41

Problemi correlati