Django 002: Модэль method ашиглах нь

Zorig
limitx
Published in
4 min readNov 23, 2017

1сарын өмнө эхлүүлсэн draft :P

source: pexel-434446

Энэ удаа 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 дээр доорхи шиг харагдана.

__str__ method өөрчлөгдсөний дараа

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 Blog
def 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 хандахад блогын дэлгэрэнгүй хэсэгрүү орно.

id ашиглах үед

Одоо 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.author
def 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 дээр ямар ч ѳѳрчлѳлт хийгээгүйг анзаарсан уу/

slug ашиглах нь хайлтын системд өртөхөд хялбар болгох юм.

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 …) дээр тухайн нийтлэлд харьяалагдах өөрчлөлтүүд тус тус байна.

--

--

Zorig
limitx
Editor for

Lover(Programming, Anime, Manga, Music, Movie, FilmPhotography, Aikido, Travel, Internet, Open Source..) Tinker, Reader, Parkour, Web Developer, host of devnote