Энэ удаа Django дээр модэлын method ашиглах, slug URL тохируулах зэргийг үзэе. Урьдны нийтлэлээр танил болсон virtual орчин ашиглахаас гадна github дээр тавьсан төслөө ашиглая. Гит ашиглан төслөө клон хийж аваад virtual орчин оо үүсгэж ажиллуулна.
/Хэрвээ ssh тохируулсан бол ssh ээр нь клон хийж аваарай./
git clone https://github.com/Zorig/django-demo_project.git
Ѳмнѳх нийтлэл дээр бичсэнээр python3 хувилбар ашиглаж эхлэх тул github дээр байсан хувилбарыг python3 хувилбарт тааруулан ѳѳрчилсѳн.
1. Хамгийн эхний модэль method бол __str__
class Blog(models.Model):
title = models.CharField(max_length=50, null=True)
body = models.TextField()
author = models.CharField(max_length=50, null=True) def __str__(self):
return self.title
__str__
нь классын тухай утгыг ойлгомжтойгоор стринг төрөлтэйгээр харуулах зориулалттай. Мөн unicode руу хөрвүүлдэг тул ихэвчлэн энэ method -ыг даран(override) өөрчлөх хэрэгтэй. Жишээ нь бид дээрх утга буцаалтыг ингэж өөрчилж болох юм. return self.title + '-' + self.author
энэ тохиолдолд admin panel дээр доорхи шиг харагдана.
2. get_absolute_url
Django -д тухайн object -ын URL ямар байхыг зааж өгөх үед хэрэглэнэ.
class Blog(models.Model):
title = models.CharField(max_length=50, null=True)
body = models.TextField()
author = models.CharField(max_length=50, null=True) ...
def get_absolute_url(self):
return "/%i/" % self.id
get_absolute_url
дээр зааж өгсөн тул энэ URL -ыг urls.py
дотроо бичиж өгөх шаардлагатай.
from django.conf.urls import url, include
from django.contrib import admin
from blog.views import all_blog, single_blog #views ээс дуудаж орууллаа.urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', all_blog, name="all" ),
url(r'^(?P<blog_id>\d+)/$', single_blog, name="single"), #блог дэлгэрэнгүй
]
Харин `views.py` дотор:
from django.shortcuts import render
from .models import Blogdef all_blog(request):
blogs = Blog.objects.all()
return render(request, 'index.html', {'blogs': blogs})def single_blog(request, blog_id):
blog = Blog.objects.get(id=blog_id)
return render(request, 'single.html', {'blog':blog})
Харин одоо index.html
файл нээгээд урьд нь бичсэн хэдэн мөр маркап-д бага зэрэг өөрчлөлт оруулая.
/энд get_absolute_url
ашигласан байгаа./
{% for blog in blogs %}
<a href="{{blog.get_absolute_url}}"> <!-- Энд get_absolute_url ашиглаж байна-->
{{blog.title}}
</a>
{{blog.body}}
<hr>
{% endfor %}
Ингээд admin панел дээрээс шинэ блог оруулаад тухайн блогын ID ашиглан localhost:8000/1
хандахад блогын дэлгэрэнгүй хэсэгрүү орно.
Одоо absolute_url
-ын давуу талыг ашиглая. Үүний тулд дээрхи шиг(id ашиглаж) бичиж болох боловч Google -ын хайлтанд оруулах тул slug ашиглая(Good practice :D ).
models.py
дээрээ slug талбар нэмнэ.
class Blog(models.Model):
title = models.CharField(max_length=50, null=True)
body = models.TextField()
author = models.CharField(max_length=50, null=True)
slug = models.SlugField(unique=True, blank=True)def __str__(self):
return self.title + '-' + self.authordef get_absolute_url(self):
return "/%s" % self.slug
urls.py дээр id авах regex утгыг slug авдаг болгоё.
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', all_blog, name="all" ),
url(r'^(?P<blog_slug>[-\w]+)/$', single_blog, name="single"),
]
мөн models.py
дотор absolute_url -ыг өөрчилнө.
def get_absolute_url(self):
return "/%s" % self.slug
views.py
дараах өөрчлөлтийг хийнэ.
def single_blog(request, blog_slug):
blog = Blog.objects.get(slug=blog_slug)
return render(request, 'single.html', {'blog':blog})
Одоо test гэх slug-тэй блог үүсгэсэн гэж үзвэл localhost:8000/test
хандахад манай дэлгэрэнгүй хэсэг яг урьдны адил харагдана.
/Template дээр ямар ч ѳѳрчлѳлт хийгээгүйг анзаарсан уу/
3. save
Тухайн шинээр үүсгэж буй object эсвэл хуучин object-ыг засварлаад хадгалах дарах үед энэ функц ажиллана. Нилээд олон зорилгоор ашиглаж болох ба манай нөхцөлд slug гараар бичихээс зайлсхийж автоматаар блогын гарчгийг `slug` болгон хадгалъя.
from django.db import models
from django.utils.text import slugify #джанго дээрх өөрийнх нь slug болгох функцclass Blog(models.Model):
title = models.CharField(max_length=50, null=True)
body = models.TextField()
author = models.CharField(max_length=50, null=True)
slug = models.SlugField(unique=True, blank=True) def __str__(self):
return self.title + '-' + self.author def get_absolute_url(self):
return "/%s" % self.slug def save(self, *args, **kwargs):
self.slug = slugify(self.title, allow_unicode=True)
super(Blog, self).save(*args, **kwargs)
Ингэснээр title
дээрх утгыг аваад slug
талбарт хадгалахдаа хоосон зайг -
орлуулан цэвэрхэн URL үүсгэж байгаа юм.
4. Хөгжүүлэгч нэмэлт method бичих
Дээрх method оос гадна хөгжүүлэгч нэмэлтээр method бичиж болох юм. Жишээ нь дээрх Blog модэль дотор нийтлэлчийг slug -ын хамт буцаах method бичье.
def author_slug(self):
return self.author + ' ' + self.slug
Ингээд үүнийгээ тэмплэйт дээрээ дамжуулсан модэлийн утгыг ашиглан харуулж болох юм. {{blog.author_slug}}
гэх мэтчилэн өөрийн хүссэн method оо бичиж болох нь.
Өөрчлөлт орсон код github дээр тавигдсан байгаа. Master branch дээр хамгийн сүүлийн өөрчлөлтүүд харин бусад branch(001, 002 …) дээр тухайн нийтлэлд харьяалагдах өөрчлөлтүүд тус тус байна.