खोज…


सूचि बदलें

मान लीजिए कि आपके पास निम्नलिखित मॉडल के साथ एक सरल myblog ऐप है:

from django.conf import settings
from django.utils import timezone

class Article(models.Model):
    title = models.CharField(max_length=70)
    slug = models.SlugField(max_length=70, unique=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, models.PROTECT)
    date_published = models.DateTimeField(default=timezone.now)
    is_draft = models.BooleanField(default=True)
    content = models.TextField()

Django Admin की "परिवर्तन सूची" वह पृष्ठ है जो किसी दिए गए मॉडल की सभी वस्तुओं को सूचीबद्ध करता है।

from django.contrib import admin
from myblog.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    pass

डिफ़ॉल्ट रूप से, यह ऑब्जेक्ट "नाम" प्रदर्शित करने के लिए अपने मॉडल के __str__() विधि (या __unicode__() यदि आप __unicode__() पर) का उपयोग करेंगे। इसका मतलब है कि यदि आपने इसे ओवरराइड नहीं किया है, तो आपको लेखों की एक सूची दिखाई देगी, जिसे सभी का नाम "अनुच्छेद ऑब्जेक्ट" दिया जाएगा। इस व्यवहार को बदलने के लिए, आप __str__() विधि सेट कर सकते हैं:

class Article(models.Model):
    def __str__(self):
        return self.title

अब, आपके सभी लेखों का एक अलग नाम होना चाहिए, और "आलेख वस्तु" से अधिक स्पष्ट होना चाहिए।

हालाँकि आप इस सूची में अन्य डेटा प्रदर्शित करना चाह सकते हैं। इसके लिए, list_display उपयोग list_display :

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'author', 'date_published', 'is_draft']

list_display मॉडल फ़ील्ड और गुणों तक सीमित नहीं है। यह आपके ModelAdmin की एक विधि भी हो सकती है:

from django.forms.utils import flatatt
from django.urls import reverse
from django.utils.html import format_html

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'author_link', 'date_published', 'is_draft']
    
    def author_link(self, obj):
        author = obj.author
        opts = author._meta
        route = '{}_{}_change'.format(opts.app_label, opts.model_name)
        author_edit_url = reverse(route, args=[author.pk])
        return format_html(
            '<a{}>{}</a>', flatatt({'href': author_edit_url}), author.first_name)

    # Set the column name in the change list
    author_link.short_description = "Author"
    # Set the field to use when ordering using this column
    author_link.admin_order_field = 'author__firstname'

अतिरिक्त सीएसएस शैलियों और जेएस स्क्रिप्ट व्यवस्थापक पृष्ठ के लिए

मान लीजिए कि आपके पास एक सरल Customer मॉडल है:

class Customer(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_premium = models.BooleanField(default=False)

आप Django व्यवस्थापक में यह रजिस्टर और द्वारा खोज क्षेत्र जोड़ने first_name और last_name :

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']

ऐसा करने के बाद, खोज फ़ील्ड डिफ़ॉल्ट प्लेसहोल्डर: " कीवर्ड " के साथ व्यवस्थापक सूची पृष्ठ में दिखाई देती है। लेकिन क्या होगा अगर आप उस प्लेसहोल्डर को " नाम से खोजें " में बदलना चाहते हैं?

आप कस्टम Media में कस्टम जावास्क्रिप्ट फ़ाइल पास करके ऐसा कर सकते हैं:

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']
    
    class Media:
        #this path may be any you want, 
        #just put it in your static folder
        js = ('js/admin/placeholder.js', )

आप इस डीबगर में कौन सी आईडी या क्लास जिंगो सेट करने के लिए ब्राउज़र डिबग टूलबार का उपयोग कर सकते हैं और फिर अपना जेएस कोड लिख सकते हैं:

$(function () {
   $('#searchbar').attr('placeholder', 'Search by name')
})

इसके अलावा Media वर्ग आपको डिक्शनरी ऑब्जेक्ट के साथ सीएसएस फाइल जोड़ने की अनुमति देता है:

class Media:
    css = {
        'all': ('css/admin/styles.css',)
         }

उदाहरण के लिए हमें विशिष्ट रंग में first_name कॉलम के प्रत्येक तत्व को प्रदर्शित करने की आवश्यकता है।
डिफ़ॉल्ट रूप से Django, list_display में प्रत्येक आइटम के लिए टेबल कॉलम list_display , सभी <td> टैग में css वर्ग होगा जैसे field-'list_display_name' , हमारे मामले में यह field_first_name होगा

.field_first_name {
     background-color: #e6f2ff;
 }

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

बड़ी मेजों को संदर्भित करने वाली विदेशी कुंजियों से निपटना

डिफ़ॉल्ट रूप से, Django ForeignKey फ़ील्ड को <select> इनपुट के रूप में प्रस्तुत करता है। यदि आपके पास संदर्भित तालिका में हज़ारों या दस हज़ार प्रविष्टियाँ हैं, तो इससे पृष्ठ वास्तव में धीरे-धीरे लोड हो सकते हैं। और यहां तक कि अगर आपके पास केवल सैकड़ों प्रविष्टियां हैं, तो सभी के बीच एक विशेष प्रविष्टि की तलाश करना काफी असुविधाजनक है।

इसके लिए एक बहुत ही आसान बाहरी मॉड्यूल django-autocomplete-light (DAL) है। यह <select> फ़ील्ड के बजाय स्वतः पूर्ण फ़ील्ड का उपयोग करने में सक्षम बनाता है।

django- स्वतः पूर्ण-प्रकाश उदाहरण

views.py

from dal import autocomplete

class CityAutocomp(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = City.objects.all()
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

urls.py

urlpatterns = [
    url(r'^city-autocomp/$', CityAutocomp.as_view(), name='city-autocomp'),
]

forms.py

from dal import autocomplete

class PlaceForm(forms.ModelForm):
    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        widget=autocomplete.ModelSelect2(url='city-autocomp')
    )

    class Meta:
        model = Place
        fields = ['__all__']

admin.py

@admin.register(Place)
class PlaceAdmin(admin.ModelAdmin):
    form = PlaceForm


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow