2
Simple paging with Golang templates and GORM
source link: https://kenanbek.github.io/golang-template-gorm-paging-offset-limit
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Simple paging with Golang templates and GORM
Published: Jul 14, 2020 / Last modified: Jul 15, 2020
Go code:
const PageCount = 10
type Paging struct {
Page int
PrevPage int
NextPage int
HasPrev bool
HasNext bool
}
type HomePage struct {
Title string
Paging Paging
Articles []articles.Article
}
func (ws *Website) homePageHandler(w http.ResponseWriter, r *http.Request) {
var page int
var err error
pageStr := r.URL.Query().Get("page")
if pageStr != "" {
page, err = strconv.Atoi(pageStr)
if err != nil {
log.Println("failed to parse page param", err)
}
}
tmpl, err := template.ParseFiles("resources/fe/website/home.html")
if err != nil {
log.Println("failed to parse template", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
count, err := ws.DB.Articles().CountArticles()
if err != nil {
errStr := fmt.Sprintf("failed to get count of articles from storage: %v", err)
log.Println(errStr)
}
offset := page * PageCount
paging := Paging{}
if page == 0 {
paging.HasPrev = false
} else {
paging.HasPrev = true
}
if page >= count/PageCount {
paging.HasNext = false
} else {
paging.HasNext = true
}
paging.Page = page
paging.NextPage = page + 1
paging.PrevPage = page - 1
arts, err := ws.DB.Articles().ListArticles(offset, PageCount)
if err != nil {
errStr := fmt.Sprintf("failed to load articles from storage: %v", err)
log.Println(errStr)
}
hp := HomePage{
Title: "List of articles",
Articles: arts,
Paging: paging,
}
err = tmpl.Execute(w, hp)
if err != nil {
errStr := fmt.Sprintf("failed to render template: %v", err)
log.Println(errStr)
}
}
Methods ListArticles
and CountArticles
are implemented by using GORM:
func (rp *Articles) CountArticles() (int, error) {
var count int
if err := rp.db.Model(&Article{}).Order("posted DESC").Count(&count).Error; err != nil {
return 0, err
} else {
return count, nil
}
}
func (rp *Articles) ListArticles(offset, limit int) ([]Article, error) {
var articles []Article
if err := rp.db.Order("posted DESC").Offset(offset).Limit(limit).Find(&articles).Error; err != nil {
return nil, err
} else {
return articles, nil
}
}
HTML template:
<nav aria-label="...">
<ul class="pagination justify-content-center">
<li class="page-item">
<a class="page-link" href="?page=">Previous</a>
</li>
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true">Previous</a>
</li>
<li class="page-item active" aria-current="page">
<a class="page-link" href="#"> <span class="sr-only">(current)</span></a>
</li>
<li class="page-item">
<a class="page-link" href="?page=">Next</a>
</li>
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true">Next</a>
</li>
</ul>
</nav>
[ Tags ]
go
template
gorm
paging
offset
limit
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK