2

Simple paging with Golang templates and GORM

 2 years ago
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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK