Django
शासन प्रबंध
खोज…
सूचि बदलें
मान लीजिए कि आपके पास निम्नलिखित मॉडल के साथ एक सरल 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>
फ़ील्ड के बजाय स्वतः पूर्ण फ़ील्ड का उपयोग करने में सक्षम बनाता है।
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