Django-ning sinfga asoslangan umumiy ko'rinishlarini kuchli va samarali veb-ishlab chiqish uchun moslashtirish bo'yicha keng qamrovli qo'llanma. Ko'rinishlarni o'z ehtiyojlaringizga qanday moslashtirishni o'rganing.
Django sinfga asoslangan ko'rinishlari: Umumiy ko'rinishlarni moslashtirishni o'zlashtirish
Django-ning sinfga asoslangan ko'rinishlari (CBV) veb-ilovalarni yaratishning kuchli va qayta ishlatiladigan usulini taqdim etadi. Umumiy ko'rinishlar, CBV-ning kichik to'plami, ro'yxatlarni ko'rsatish, batafsil ko'rinishlar, ob'ektlarni yaratish, yangilash va o'chirish kabi umumiy vazifalar uchun oldindan yaratilgan yechimlarni taklif qiladi. Ushbu umumiy ko'rinishlar juda qulay bo'lsa-da, ular ko'pincha ilovangizning o'ziga xos ehtiyojlariga mukammal mos kelishi uchun moslashtirishni talab qiladi. Ushbu keng qamrovli qo'llanma Django-ning umumiy ko'rinishlarini moslashtirishning turli xil usullarini o'rganadi, bu sizga samarali va xizmat ko'rsatishga qulay veb-ilovalarni yaratish imkonini beradi.
Django-ning sinfga asoslangan ko'rinishlarini tushunish
Moslashtirishga kirishishdan oldin, keling, CBV va umumiy ko'rinishlarning asoslarini eslab o'tamiz. An'anaviy funksiyaga asoslangan ko'rinishlar (FBV) HTTP so'rovlarini bitta funktsiya ichida to'g'ridan-to'g'ri hal qiladi. Boshqa tomondan, CBV ko'rinish mantig'ini sinflarga ajratadi, bu esa yanada tuzilgan va ob'ektga yo'naltirilgan yondashuvni ta'minlaydi. Bu yaxshi kodni tashkil etishga, qayta ishlatishga va sinovdan o'tkazishga olib keladi.
Umumiy ko'rinishlar - bu umumiy veb-ishlab chiqish vazifalarini bajarish uchun mo'ljallangan oldindan qurilgan CBV. Ular View
va TemplateView
kabi asosiy sinflardan meros oladilar va ixtisoslashtirilgan funktsionalarni taklif qilishadi. Umumiy umumiy ko'rinishlarga quyidagilar kiradi:
ListView
: Ob'ektlar ro'yxatini ko'rsatadi.DetailView
: Bitta ob'ektning tafsilotlarini ko'rsatadi.CreateView
: Shakl yordamida ob'ekt yaratishni boshqaradi.UpdateView
: Shakl yordamida ob'ektni yangilashni boshqaradi.DeleteView
: Ob'ektni o'chirishni boshqaradi.
Ushbu umumiy ko'rinishlar mustahkam poydevorni ta'minlaydi, ammo real dunyo ilovalari ko'pincha ularning xatti-harakatlarini moslashtirishni talab qiladi. Keling, moslashtirishning turli xil usullarini ko'rib chiqaylik.
Moslashtirish usullari
Django-ning umumiy ko'rinishlarini moslashtirishning bir necha usullari mavjud, oddiy atributlarni bekor qilishdan tortib, murakkab usullarni bekor qilishgacha. Tegishli usul talab qilinadigan moslashtirish darajasiga bog'liq.
1. Atributlarni bekor qilish
Moslashtirishning eng oddiy shakli - umumiy ko'rinish sinfining atributlarini bekor qilishni o'z ichiga oladi. Bu model, shablon nomi yoki kontekst ob'ektining nomi kabi asosiy xususiyatlarni o'zgartirish uchun idealdir.
Misol: ListView
ni moslashtirish
Maqolalar ro'yxatini ko'rsatmoqchisiz, lekin siz shaxsiy shablon va boshqa kontekst ob'ektining nomini ishlatmoqchisiz.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
Ushbu misolda biz model
, template_name
va context_object_name
atributlarini bekor qildik. Shuningdek, maqolalarni filtrlash va ularni nashr etish sanasiga ko'ra tartiblash uchun get_queryset
usulini bekor qildik. get_queryset
usuli sizga ro'yxat ko'rinishiga qaysi ob'ektlar kiritilishini boshqarish imkonini beradi. Bu filtrlashni, tartiblashni va sahifalarni amalga oshirish uchun foydalidir.
2. Usulni bekor qilish
Usulni bekor qilish umumiy ko'rinish sinfida mavjud usullarning xatti-harakatlarini o'zgartirishga imkon beradi. Bu ko'rinishning mantiqi ustidan ko'proq nazoratni ta'minlaydi. Bekor qilish uchun umumiy usullarga quyidagilar kiradi:
get_queryset()
: Ko'rinish tomonidan ishlatiladigan so'rovlar to'plamini boshqaradi.get_context_data()
: Shablon kontekstiga ma'lumotlarni qo'shadi.form_valid()
: Shaklni muvaffaqiyatli topshirishni boshqaradi.form_invalid()
: Shaklni noto'g'ri topshirishni boshqaradi.get_success_url()
: Shaklni muvaffaqiyatli topshirishdan keyin qayta yo'naltiriladigan URLni aniqlaydi.get_object()
: DetailView, UpdateView va DeleteView uchun ob'ektni oladi
Misol: DetailView
ni moslashtirish
Keling, maqolaning tafsilotlarini ko'rsatmoqchisiz, lekin siz shuningdek, tegishli izohlarni shablon kontekstiga qo'shmoqchisiz.
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
Bu yerda biz get_context_data()
usulini shablon kontekstiga comments
o'zgaruvchisini qo'shish uchun bekor qildik. Bu sizga article_detail.html
shablonida tegishli izohlarni osongina kirish va ko'rsatish imkonini beradi.
3. Mixinlardan foydalanish
Mixin - bu ma'lum bir funktsionalni ta'minlaydigan qayta ishlatiladigan sinflar. Ular ko'rinishning asosiy mantig'ini o'zgartirmasdan xususiyatlarni qo'shish uchun umumiy ko'rinishlar bilan birlashtirilishi mumkin. Django bir nechta o'rnatilgan mixinlarni taqdim etadi va siz o'zingiz ham yaratishingiz mumkin.
Misol: LoginRequiredMixin
dan foydalanish
LoginRequiredMixin
faqat tizimga kirgan foydalanuvchilar ma'lum bir ko'rinishga kirishini ta'minlaydi.
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Ushbu misolda biz LoginRequiredMixin
dan ArticleCreateView
ga faqat tizimga kirgan foydalanuvchilarning kirishini cheklash uchun foydalandik. Biz form_valid
usulini maqolaning muallifini avtomatik ravishda joriy foydalanuvchiga o'rnatish uchun ham bekor qildik. Bu miksinlarning murakkab moslashtirishga erishish uchun usulni bekor qilish bilan qanday birlashtirilishi mumkinligini ko'rsatadi.
Shaxsiy Mixinlarni yaratish
Shuningdek, siz qayta ishlatiladigan mantiqni o'z ichiga oladigan o'z mixinlarni yaratishingiz mumkin. Misol uchun, siz joriy foydalanuvchini model misolining muallifi sifatida avtomatik ravishda o'rnatadigan yoki ruxsat tekshiruvlarini boshqaradigan miksindan foydalanishingiz mumkin.
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# Replace with your desired redirection or error handling
return redirect('permission_denied') # Or raise an exception
Ushbu AuthorRequiredMixin
faqat xodim a'zolariga yoki ob'ekt muallifiga kirishga imkon beradi. Ruxsat etilgan foydalanuvchilarning ob'ektlarni o'zgartirishi yoki o'chirishini ta'minlash uchun ushbu mixindan UpdateView
yoki DeleteView
bilan foydalanishingiz mumkin.
4. Shablonni moslashtirish
Yuqoridagi usullar ko'rinishning mantig'ini o'zgartirishga qaratilgan bo'lsa-da, ma'lumotlarni taqdim etishni boshqarish uchun shablonni moslashtirish juda muhimdir. Umumiy ko'rinishlar HTML chiqishini ko'rsatish uchun shablonlardan foydalanadi. Siz ushbu shablonlarni ilovangizning dizayni va brendiga moslashtirishingiz mumkin.
Shablonni nomlash konventsiyalari
Umumiy ko'rinishlar ma'lum shablonni nomlash konventsiyalariga amal qiladi. Misol uchun:
ListView
:<app_name>/<model_name>_list.html
(masalan,articles/article_list.html
)DetailView
:<app_name>/<model_name>_detail.html
(masalan,articles/article_detail.html
)CreateView
/UpdateView
:<app_name>/<model_name>_form.html
(masalan,articles/article_form.html
)DeleteView
:<app_name>/<model_name>_confirm_delete.html
(masalan,articles/article_confirm_delete.html
)
Siz boshqa shablondan foydalanish uchun ko'rinish sinfidagi template_name
atributini bekor qilishingiz mumkin. Shablon ichida siz ko'rinish tomonidan taqdim etilgan ma'lumotlarga kontekst ob'ekt orqali kirishingiz mumkin. Standart kontekst ob'ektining nomi odatda model nomining kichik harf versiyasi (masalan, Article
uchun article
)dir. Siz buni context_object_name
atributi yordamida o'zgartirishingiz mumkin.
Misol: ListView
Shabloni moslashtirish
articles/article_list.html
shablonida siz maqolalar ro'yxatini ko'rsatish uchun articles
kontekst o'zgaruvchisiga (yuqoridagi ArticleListView
misolida belgilangan) takrorlashingiz mumkin.
<h1>Maqolalar</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. Shaklni moslashtirish (CreateView & UpdateView)
CreateView
va UpdateView
foydalanuvchi kiritishini boshqarish uchun Django shakllariga tayanadi. Ushbu shakllarni moslashtirish sizga ko'rsatilgan maydonlarni, ularning tasdiqlash qoidalarini va ularning ko'rinishini boshqarish imkonini beradi.
form_class
dan foydalanish
Siz ko'rinish sinfida form_class
atributi bilan foydalanish uchun shakl sinfini belgilashingiz mumkin. Agar siz shakl sinfini ko'rsatmasangiz, Django avtomatik ravishda ko'rinish bilan bog'liq modelga asoslangan ModelForm
ni yaratadi.
Shakl usullarini bekor qilish
Siz shakl sinfidagi usullarni uning xatti-harakatlarini moslashtirish uchun bekor qilishingiz mumkin. Bekor qilish uchun umumiy usullarga quyidagilar kiradi:
__init__()
: Shaklni boshlang va uning maydonlarini o'zgartiring.clean()
: Bir nechta maydonlar bo'yicha shaxsiy tasdiqlashni amalga oshiring.clean_<field_name>()
: Muayyan maydon uchun shaxsiy tasdiqlashni amalga oshiring.
Misol: Maqola shaklini moslashtirish
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Sarlavha kamida 5 ta belgidan iborat bo'lishi kerak.")
return title
Ushbu misolda biz ArticleForm
ni Meta
sinfidagi fields
atributini o'rnatish orqali moslashtirdik, bu shaklga qaysi maydonlar kiritilishi kerakligini belgilash uchun. Biz shuningdek, __init__()
usulini content
maydonining vidjetini va clean_title()
usulini title
maydoni uchun shaxsiy tasdiqlashni qo'shish uchun bekor qildik.
6. Dinamik shaklni boshqarish
Ba'zan siz foydalanuvchi yoki boshqa omillarga asoslangan shaklni dinamik ravishda sozlashni talab qilasiz. Bunga ko'rinish sinfida get_form_kwargs()
usulini bekor qilish orqali erishishingiz mumkin. Ushbu usul shaklning konstruktoriga qo'shimcha kalit so'z argumentlarini o'tkazish imkonini beradi.
Misol: Foydalanuvchini shaklga o'tkazish
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Keyin, sizning ArticleForm
-da siz foydalanuvchini __init__()
usulidagi user
kalit so'zi argumenti orqali kirishingiz mumkin.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Only staff can publish
Ushbu misolda biz joriy foydalanuvchini shaklga o'tkazamiz va agar foydalanuvchi xodim bo'lmasa, dinamik ravishda is_published
maydonini olib tashlaymiz. Bu sizning foydalanuvchining ruxsatiga asoslanib, shaklni dinamik ravishda qanday sozlash mumkinligini ko'rsatadi.
Kengaytirilgan moslashtirish: Viewsetlardan foydalanish
Ko'proq murakkab ilovalar uchun, ayniqsa API-larga tegishli bo'lganlar uchun Django REST Framework (DRF) ViewSetlaridan foydalanishni ko'rib chiqing. ViewSetlar tegishli ko'rinishlarni (masalan, ro'yxat, yaratish, olish, yangilash, o'chirish) bitta sinfga birlashtiradi, bu API uchtalarini boshqarishning tozalash va yanada tashkil etilgan usulini ta'minlaydi.
Misol: ArticleViewSet yaratish
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
Ushbu oddiy ArticleViewSet
maqolalar uchun barcha standart CRUD (Yaratish, O'qish, Yangilash, O'chirish) operatsiyalarini taqdim etadi. Siz get_queryset()
, perform_create()
va perform_update()
kabi usullarni bekor qilish kabi umumiy ko'rinishlar kabi ViewSetlarni moslashtirishingiz mumkin.
Umumiy ko'rinishlarni moslashtirish uchun global mulohazalar
Umumiy ko'rinishlarni global auditoriya uchun moslashtirganda, quyidagi mulohazalarni yodda tuting:
- Mahalliylashtirish va xalqarolashtirish (L10n/I18n): Shablonlaringiz va shakllaringiz bir nechta tillarni va mintaqaviy formatlarni qo'llab-quvvatlashini ta'minlang. Django-ning o'rnatilgan i18n/l10n xususiyatlaridan foydalaning.
- Vaqt zonalari: Foydalanuvchining mahalliy vaqtida sanalar va vaqtlarni ko'rsatish uchun vaqt zonalarini konvertatsiyasini to'g'ri boshqaring. Django-ning
timezone
modulidan foydalaning. - Valyutani formatlash: Turli mintaqalar uchun valyuta qiymatlarini tegishli formatlang. Valyutani formatlash uchun
babel
kabi kutubxonadan foydalanishni ko'rib chiqing. - Sana va raqam formatlash: Foydalanuvchining lokaliga asoslangan tegishli sana va raqam formatlaridan foydalaning.
- Kirish imkoniyati: Sizning shaxsiy ko'rinishlaringiz va shablonlaringiz nogironligi bo'lgan foydalanuvchilar uchun mavjud bo'lishini ta'minlang. WCAG kabi kirish imkoniyati bo'yicha ko'rsatmalarga amal qiling.
- Reaktiv dizayn: Sizning shablonlaringiz reaktiv ekanligiga va butun dunyo bo'ylab foydalanuvchilar tomonidan ishlatiladigan turli ekran o'lchamlari va qurilmalariga moslashishiga ishonch hosil qiling.
- Madaniy sezuvchanlik: Ko'rinishlaringiz va shablonlaringizni loyihalashda madaniy farqlarga e'tibor bering. Ba'zi madaniyatlarga nisbatan tajovuzkor bo'lishi mumkin bo'lgan tasvirlar yoki tildan foydalanishdan saqlaning. Misol uchun, rang assotsiatsiyalari va ramzlari madaniyatlarda juda boshqacha ma'nolarga ega bo'lishi mumkin.
Misol: Vaqt zonalarni boshqarish
Nashr etilgan sanani foydalanuvchining mahalliy vaqt zonasida ko'rsatish uchun siz shabloningizdagi timezone
tegidan foydalanishingiz mumkin:
{% load tz %}
<p>Nashr etilgan: {% timezone article.publication_date %}</p>
Django sozlamalar faylingizda USE_TZ = True
ekanligiga ishonch hosil qiling.
Umumiy ko'rinishlarni moslashtirishning eng yaxshi amaliyotlari
Sizning sozlamalaringizni saqlashga qulay va samarali bo'lishini ta'minlash uchun ushbu eng yaxshi amaliyotlarga rioya qiling:
- Oddiylikni saqlang: O'zingizning moslashtirishlaringizni ortiqcha murakkablashtirishdan saqlaning. Kerakli natijaga erishadigan eng oddiy texnikadan foydalaning.
- Kodingizni hujjatlashtiring: O'zgarishlaringizni va nima uchun zarurligini tushuntirish uchun izohlar qo'shing.
- Sinovni sinchkovlik bilan o'tkazing: O'zgarishlaringiz to'g'ri ishlashini ta'minlash uchun birlik sinovlarini yozing.
- Mixinlardan oqilona foydalaning: Umumiy funktsiyalarni o'z ichiga olish uchun qayta ishlatiladigan mixinlarni yarating.
- Django-ning konventsiyalariga amal qiling: Django-ning kodlash uslubi va nomlash konventsiyalariga rioya qiling.
- Xavfsizlikni ko'rib chiqing: Ko'rinishlarni moslashtirishda potentsial xavfsizlik zaifliklaridan xabardor bo'ling. Foydalanuvchi kiritilishini tozalang va Kross-Sayt Skripting (XSS) va SQL Inyeksiya kabi umumiy hujumlardan himoya qiling.
Xulosa
Django-ning sinfga asoslangan umumiy ko'rinishlari veb-ilovalarni yaratishning kuchli va moslashuvchan usulini taqdim etadi. Ushbu qo'llanmada ko'rsatilgan moslashtirish usullarini o'zlashtirish orqali siz umumiy ko'rinishlarni o'ziga xos ehtiyojlaringizga moslashtirishingiz, samarali, xizmat ko'rsatishga qulay va global ravishda mavjud veb-ilovalarni yaratishingiz mumkin. Oddiy atributni bekor qilishdan murakkab usulni bekor qilish va miksindan foydalanishgacha, imkoniyatlar juda katta. Ilovalaringiz turli xalqaro auditoriyaga xizmat ko'rsatishini ta'minlash uchun global nuqtai nazarlarni va eng yaxshi amaliyotlarni hisobga olishni unutmang.