2010-09-23 17 views
17

पर एक कस्टम बटन जोड़ें मेरे पास Django में नियमित रूप से एक एप्लिकेशन है जो केवल व्यवस्थापक के लिए उपलब्ध होगा। मैं क्या करना चाहता हूं व्यवस्थापक एप के इस एप्लिकेशन के अनुभाग में दिनचर्या करने के लिए एक बटन जोड़ें।एक Django एप्लिकेशन के व्यवस्थापक पृष्ठ

क्या मुझे इसके लिए एक टेम्पलेट बनाना है, और यदि ऐसा है, तो मैं व्यवस्थापक में किसी ऐप के लिए HTML टेम्पलेट कैसे जोड़ूं। या शायद एक बटन जोड़ने के लिए एक आदेश है?

+1

एक अलग पृष्ठ क्यों नहीं बनाते जिसके लिए व्यवस्थापक लॉगिन की आवश्यकता होती है? यह व्यवस्थापक पृष्ठ के साथ गड़बड़ करने से अक्सर आसान है। –

+0

कस्टम बटन के लिए एक दूरस्थ विकल्प व्यवस्थापक क्रिया https://docs.djangoproject.com/en/1 है।10/ref/contrib/admin/actions/ – Wtower

उत्तर

13

व्यवस्थापक रूपों के साथ मेसिंग जटिल हो सकता है लेकिन मुझे आमतौर पर पता चला है कि लिंक, बटन या अतिरिक्त जानकारी जोड़ना आसान और सहायक है। (संबंधित वस्तुओं के लिंक की एक सूची की तरह एक इनलाइन बनाने के लिए, संपादित करने से अधिक देखी जाने वाली चीज़ों के लिए esp)।

से Django docs

क्योंकि व्यवस्थापक टेम्पलेट्स के मॉड्यूलर डिजाइन की

, यह आमतौर पर एक पूरा टेम्पलेट की जगह आवश्यक है और न ही उचित न है। यह है जो टेम्पलेट के अनुभाग को ओवरराइड करने के लिए लगभग हमेशा बेहतर होता है जिसे आप बदलने की आवश्यकता है।

यह फ़ॉर्म के शीर्ष पर एक सूची जोड़ देगा।

templates/admin/[your_app]/[template_to_override] में रखें:

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

{% block form_top %} 

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

{% endblock %} 
-26

व्यवस्थापक पृष्ठों के साथ गड़बड़ न करें।

  1. इसके लिए "एप्लिकेशन" बनाएं। हां, आपका काम सिर्फ "दिनचर्या" है। वह ठीक है। कई छोटे अनुप्रयोग एक अच्छी बात है।

  2. इस एप्लिकेशन में models.py में कुछ भी नया नहीं है। कोई नया मॉडल नहीं कोड की शून्य रेखाएं।

  3. इस एप्लिकेशन में urls.py में एक उपयोगी यूआरएल है। ऐसा कुछ जिसे इस व्यवस्थापक पृष्ठ को प्रदर्शित करने के लिए उपयोग किया जा सकता है। एक यूआरएल कोड की कई रेखाएं (एक दर्जन से भी कम)

  4. इस एप्लिकेशन में views.py में एक दृश्य कार्य है। "जीईटी" पर, यह दृश्य फ़ंक्शन फ़ॉर्म प्रस्तुत करता है। "पोस्ट" पर, यह दृश्य फ़ंक्शन "रूटीन" करता है। यह आपके आवेदन का "दिल" है। जीईटी - बेशक - बस प्रदर्शन के लिए टेम्पलेट देता है। POST वास्तविक काम करता है, और अंतिम स्थिति या कुछ देता है।

यह दृश्य फ़ंक्शन एक सजावट से संरक्षित है ताकि केवल एक व्यवस्थापक इसे निष्पादित कर सके। http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test देखें। आप एक व्यवस्थापक होने के लिए एक परीक्षा लिखना चाहते हैं। lambda u: u.is_staff शायद यह है।

  1. इस एप्लिकेशन में एक टेम्पलेट है, जो GET और POST द्वारा प्रस्तुत किया गया है। उस टेम्पलेट में आपके बटन के साथ आपका फॉर्म है। वह जिसे आप आसानी से व्यवस्थापक में जोड़ नहीं सकते हैं।

  2. tests.py दो उपयोगकर्ताओं के साथ एक परीक्षण केस है, जो एक व्यवस्थापक है और जो एक व्यवस्थापक नहीं है।

अंतर्निहित व्यवस्थापक पृष्ठों के साथ कोई गड़बड़ नहीं है।

+4

एक नया एप्लिकेशन बनाते समय भी, उस एप्लिकेशन के पास अपने मॉडल के लिए व्यवस्थापक पृष्ठ संबद्ध करने का विकल्प होता है। तो कह रहे हैं "बस एक नया ऐप बनाएं" पूरी तरह से बिंदु को याद करता है। – Cerin

+1

@ सेरिन: "तो कह रहा है" बस एक नया ऐप बनाएं "पूरी तरह से बिंदु को याद करता है"। शायद। क्या आप एक ऐसा उत्तर प्रदान कर सकते हैं जो पूरी तरह से बिंदु को याद नहीं करता? –

+0

@Cerin स्वीकार्य उत्तर कौन सा है? – Yang

2

तुम भी django-admin-tools उपयोग कर सकते हैं, जो आप आसानी से एक डैशबोर्ड की तरह व्यवस्थापक पहले पन्ने अनुकूलित करने के लिए अनुमति देता है। लिंकलिस्ट का उपयोग करके, आप कुछ दृश्य विधि को इंगित कर सकते हैं और जांच सकते हैं कि उपयोगकर्ता प्रमाणीकृत है या नहीं। यह थिएस प्रकार है:

# 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) ओवरराइड 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> 

यह निश्चित रूप से, मान लिया गया है, कि button की स्ट्रिंग प्रतिनिधित्व उपयुक्त ब्राउज़र है input या button तत्व, और django.utils.safestring.mark_safe के साथ सुरक्षित चिह्नित किया गया है। वैकल्पिक रूप से, आप safe टेम्पलेट फ़िल्टर का उपयोग कर सकते हैं या button के गुणों को सीधे <input> बनाने के लिए उपयोग कर सकते हैं। मेरी राय में, पाइथन स्तर पर ऐसी चीजों को अलग करना बेहतर है।

2) अवहेलना 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, 
    ) 

इस विधि आप आसानी से किसी ModelAdmin बटन जोड़ने के लिए सक्षम बनाता। वैकल्पिक रूप से चरण (1) तक, आप admin/change_form.html का विस्तार कर सकते हैं और submit_row ब्लॉक को ओवरराइड कर सकते हैं। टेम्पलेट में आवश्यक अतिरिक्त टैग के कारण यह थोड़ा और वर्बोज़ होगा।

यदि आप अपने सभी मॉडलों (या एक विशिष्ट सबसेट) में अतिरिक्त कार्रवाई उपलब्ध करना चाहते हैं तो वांछित कार्यक्षमता के साथ ModelAdmin उपclass (उदाहरण के लिए आपके मॉडल में संग्रह जोड़ना होगा। आप हटाए जाने के लिए ओवरराइड भी जोड़ सकते हैं- - और अन्य डिफ़ॉल्ट बटन - ताकि मोड को हटाए जाने के बजाय संग्रहीत किया जा सके; इसके लिए कुछ टेम्पलेट संशोधनों की आवश्यकता होगी)

+2

एक स्वीकार्य उत्तर होना चाहिए। –

0

आप इस तरह के ऑब्जेक्ट के लिए कस्टम व्यवस्थापक कार्रवाई जोड़ने पर विचार कर सकते हैं (जैसा कि निर्मित है 'हटाएं'), यदि उपयुक्त हो। कुछ लाभों में शामिल हैं: "शुद्ध Django", टेम्पलेट्स के साथ गड़बड़ नहीं है, और एक साथ कई वस्तुओं पर कार्य करने में सक्षम होने के नाते। सरल कार्यों कि परिवर्तन सूची पृष्ठ पर चयनित वस्तुओं की एक सूची के साथ बुलाया हो -

Django के व्यवस्थापक आप लिख सकते हैं और रजिस्टर "कार्रवाई" करने देता है। यदि आप व्यवस्थापक में कोई भी परिवर्तन सूची देखते हैं, तो आप इस सुविधा को क्रिया में देखेंगे; Django जहाजों को "सभी 0 मॉडलों के लिए उपलब्ध ऑब्जेक्ट्स" हटाएं।

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

मैं कैसे एक कस्टम क्रिया बटन है, जो सभी को एक साथ एक और जवाब है जोड़ने के बारे में इस लेख से विचार आया। हालांकि मैं सरल अंतर्निहित कार्यों के साथ प्राप्त करने में सक्षम था।

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

संबंधित मुद्दे