# Python Django Tutorial: Full-Featured Web App Part 11 - Pagination

## Метаданные

- **Канал:** Corey Schafer
- **YouTube:** https://www.youtube.com/watch?v=acOktTcTVEQ
- **Дата:** 31.08.2018
- **Длительность:** 37:00
- **Просмотры:** 235,641

## Описание

In this Python Django Tutorial, we will be learning how to use pagination so that we aren't pulling down too many posts at once. We will also learn how to create a page for posts created by a specific user. Let's get started...

The code for this series can be found at:
https://github.com/CoreyMSchafer/code_snippets/tree/master/Django_Blog

Posts.json file:
https://raw.githubusercontent.com/CoreyMSchafer/code_snippets/master/Django_Blog/snippets/posts.json


✅ Support My Channel Through Patreon:
https://www.patreon.com/coreyms

✅ Become a Channel Member:
https://www.youtube.com/channel/UCCezIgC97PvUuR4_gbFUs5g/join

✅ One-Time Contribution Through PayPal:
https://goo.gl/649HFY

✅ Cryptocurrency Donations:
Bitcoin Wallet - 3MPH8oY2EAgbLVy7RBMinwcBntggi7qeG3
Ethereum Wallet - 0x151649418616068fB46C3598083817101d3bCD33
Litecoin Wallet - MPvEBY5fxGkmPQgocfJbxP6EmTo5UUXMot

✅ Corey's Public Amazon Wishlist
http://a.co/inIyro1

✅ Equipment I Use and Books I Recommend:
https://www.amazon.com/shop/coreyschafer

▶️ You Can Find Me On:
My Website - http://coreyms.com/
My Second Channel - https://www.youtube.com/c/coreymschafer
Facebook - https://www.facebook.com/CoreyMSchafer
Twitter - https://twitter.com/CoreyMSchafer
Instagram - https://www.instagram.com/coreymschafer/

#Python #Django

## Содержание

### [0:00](https://www.youtube.com/watch?v=acOktTcTVEQ) Introduction

hey there how's it going everybody in this video we're gonna add a little more functionality to our site by adding some pagination so that we aren't pulling down too many posts at once and also we'll learn how to create a page of post filtered by a specific user that is also going to be paginate 'add so let's go ahead and get started so first of all since we're going to be working with pagination I'm going to take a second to add more posts to our current application from a variety of different users that way we have enough posts to see this pagination in action now I'm going to add some posts with a short script in the Jango shell using a JSON file that I've prepared but if you want to skip this part then it's not completely necessary I'm only doing this so that we have more data but if you'd like to follow along without doing this then you could just create some additional posts on your own so you only need about ten posts or so to see this pagination in action but if you do want to follow along and use the same JSON file as me then I've left a link in the description section below to the JSON of my sample post that I'll be creating here and if you want to use the same titles and content that I'm using in the video then you can just download that and use it now if you do want to use the shell to add these posts then I've actually put that post dot JSON file within my project folder where the manage dot py file is located so you should do that too if you choose to do the same so this is the file here this

### [1:17](https://www.youtube.com/watch?v=acOktTcTVEQ&t=77s) Importing Posts

post Chaisson and these are the titles and the fake content and we can see that this is located here in our Django project so now I'm going to close that down and open up our terminal and I'm gonna add these through the Django shell so I'm gonna say Python manage dot py and then she'll and again this part is optional you can just manually add about 10 posts or so from the application that we've currently built and that will be fine but to do this if you want to do it this way then within the shell I'm gonna make a couple of imports so I'll import JSON and then I want to import my post model so from blog models import post and since that post dot JSON file is in the same directory as my manage py file then we can just open it up directly so I can say with open and that is post dot JSON and we'll say as F and now within here we have to end it now we'll use the JSON module to load that into Python so I'll say posts underscore JSON is equal to json dot load and we want to load in that file okay and now i'm going to loop over all the posts that were in my json file and add them to our application so i'll say for post in post underscore json and now we need to indent since we're inside a for loop now we'll create a post so post is equal to post and we will set the title equal to that post and access the title key and then we'll do the same thing for content so I'll say content is equal to post and access the content key and lastly we will say that the author underscore ID is equal to post and we will access the user underscore ID of that object and those keys that I'm accessing there are just what I call those inside the JSON file so on the next line we will do a post dot save to save all of those okay and it looks like we didn't get any errors so that's good now I can exit out of the application and now we should have about 25 more

### [3:21](https://www.youtube.com/watch?v=acOktTcTVEQ&t=201s) Pagination

posts or so now that we've run that short script so now let me clear my screen okay so since we didn't get any errors they should have saved all those properly so let's run our application and see what our home page looks like so I'll say Python manage py run server and now we can open this in the browser so I will reload this okay so now it looks like we have more post to work with now so that's good so that worked and these posts are just gibberish lorem ipsum generated stuff so if it asks you to translate them or anything like that then you can just say no so now we should have about 25 new post so if I scroll down through these then we can see that it's kind of lot of information to have on a single page now if these posts had images included in them and things like that then loading them all in at once like this could really slow down our webpage it would be better if we could paginate this stuff so that we can load in a certain number of posts on one page and then display links at the bottom of the page to the other pages of posts and Django makes this really easy for us so to do this we're going to be working with a paginate or object so let me stop our dev server for a second and open up the Jango shell so that we can look at a paginate or object interactively so I will pull up our dev server and stop this for a second and let's open back up our Python shell ok so within here I'm going to import the paginate or clasp and to do that we can say from Jango dot cor dot paginate err import paginate err and now let's create some dummy posts that we want to paginate so I'm just going to do a list of short strings so I'm just going to say one and then let me copy this so I can just paste it in five times here and now I'll change the numbers of these so this will be the second post third this will be the fourth and this will be the fifth okay so now we're going to create a paginate or object out of these posts and we are going to make this so that it is two posts per page so I'll say P is equal to paginate err and then we will pass in posts and then a - 4 - post per page okay so we can pretend that the list of strings is actually a list of articles and we just broke that up into two posts per page so there should be three pages total so with one value left on that third page so if I say P dot num underscore pages then we can see that we have three pages and if we wanted to loop over those pages then we could use the page range method now that will return a Python range that we can loop over so I'll say for page in P dot page underscore range that's actually not a method it's an attribute so we don't need to put parentheses there and then we'll say print page and we can see that it loops over those three pages and if we want to look at a specific page then we can access it by saying so let me clear the screen here we can access it by saying p1 is equal to and now I'm just going to get page one by saying P page one and now if we look at this then we can see that it's page one of three and we can get the specific page number as an integer by saying p1 dot and that returns the number for that page now we can also look at posts on this page by saying P 1 dot object underscore list and if we run that then we can see that returns 1 & 2 as the objects on that first page now probably the most important thing that we'll be using in terms of creating navigation links for these pages is whether or not they have previous or next pages so we're on page 1 so we shouldn't have a previous page since this is the beginning so to check that I can say P 1 dot has underscore previous and this is a method so put parentheses there and we can see that is false but we should have a next page since there are three pages and we're only on the first page so if I say P 1 dot has next then this should be true and it is and if we want to get that next page number as an integer then we could do that by saying P 1 dot next underscore page underscore number and that is a method and we can see that the next page is 2 so that was a quick rundown of paginate or objects and I know that was really fast but I just want to show you a couple of things that we're going to be using in order to loop over these pages whenever we use this on our site so let's actually see how we can use this in our views and templates in order to paginate our posts so let's open up our views so

### [8:04](https://www.youtube.com/watch?v=acOktTcTVEQ&t=484s) Pagination in Views

I'm going to exit out of here and now let's open up our views and we want to open up the views for our blog so I'm gonna open the blog and then open our views here and now let me scroll down to the home page because this is one of the main ones that we're going to want to be paginating because right now we have so many posts on that home page now we're using class-based views and we saw in the last video how this can save us a lot of code by creating a lot of stuff for us in the background and pagination is no different we don't actually have to import that paginate or class and create that ourselves all we need to do is set an attribute on our list view called paginate by so underneath ordering here I can just say paginate underscore by is equal to 2 now I'm just using 2 so that we can see what this looks like with a large number of pages and I'll set that to something higher once we're done like five posts or ten post per page and with that small change that

### [9:04](https://www.youtube.com/watch?v=acOktTcTVEQ&t=544s) Testing Pagination

will actually give us some pagination functionality so let's see what we have so far so let's pull back up the terminal here and I'm going to rerun that dev server and now let's open up the home page go up to the top here and let me rerun this okay so we can see that when I reloaded that we have two posts on this page so something is working but right off the bat we can see that we don't have any links to the other pages so we'll have to do something to fix that but we can actually hard code the page request into the URL to get these other pages right now so if I go up here to my url bar and I do a forged slash and then question mark to specify that we want to put in a parameter then I can say question mark page is equal to two and if I run that then that URL query parameter of page equal to two got passed to our view and then our view handled that and gave us the second page so we had about five posts before and then I added 25 posts with that script so I think now we should have around 30 posts so there should be around 14 or 15 pages total since there are two paid posts per page so let me try to go to page 14 we can see that there is a page 14 let me try 15 okay so we must only have 28 posts because when I go to page 15 we get a 404 and anytime you run out of pages and requests that page that doesn't exist then you will get a 404 which is good okay so now all we need to do is add some links in our template so that we can actually navigate to these pages by clicking on them rather than manually typing them in to the URL bar like we're doing it right now and our class-based view already passes in the context that we'll need in order to access this page information in our template so to do this let's open up our home dot HTML template where we're going to be displaying all of our posts so first let me go back to the home page and now

### [11:03](https://www.youtube.com/watch?v=acOktTcTVEQ&t=663s) Pagination Logic

let's open up our editor and open up our home HTML template so that is within our blog app and templates and then they blog subdirectory and then home HTML ok so I think a good place for these pagination links will be right after our for loop where we loop over all of the posts so I'm going to go underneath our for loop here and now we can put in our pagination logic so the variables that got passed into our template are so let me put in a code block here and I'll say if one of those is underscore paginating and that'll just tell us if this page is paginating so now I'm going to close off that if statement by saying end if and now we'll go inside here and if this is paginate 'add then we'll print out some paginating links now there are a lot of different ways that you could style your paginating links but one way that I like is that if the page has previous posts than to give them an option to go to the very first page and also previous page so I'm gonna do that by saying we'll say if and this is going to be called page underscore obj I'm sorry that is obj and that is the page object that our view passed into our template and we've already worked with some of these page objects when we looked at these in the shell so I can check if this has previous pages by saying if page underscore obj dot has underscore previous and then we can end that if statement and let me break these up a little bit so end if and I will give some room here okay so if our current page has a previous page then I'm going to give them two options a link to go to the first page and then a link to just go to the previous page so this will be an anchor tag and this one I will say first so this will be a link to the very first page so for the href here I'm just going to put in question mark page equal to one so no matter what route we're on if it has pagination then this will use that URL query parameter of page equal to one to go to that first page of pagination so now let's also give this some styles so I'll say class is equal to and we will make this look like a button and I will give this a button style of BTN outline - info that's like a blueish style and also I'm going to give this a margin bottom of 4 so MB - 4 ok and this will go a lot

### [13:43](https://www.youtube.com/watch?v=acOktTcTVEQ&t=823s) Previous Page

faster now that I can copy and paste some of these so now I'm going to copy this now since this current page has a previous page then I'm going to give them an option to go to the first page and also the previous page so to get to the previous page instead of saying that we want the page equal to 1 then I'm going to remove that one and now put in curly braces to access a an attribute here and I'll say page underscore obj to access the page object and then dot previous underscore page underscore number so now when they click on this previous link it will go to the page equal to the previous page number okay so now let's move on and now that we've displayed the previous pages now we want to display a certain number of pages around the current page so for example if we're on page 5 then we'll like to have links to a few pages before 5 and a few pages after 5 so that someone can easily navigate to pages nearby so I'm going to do a little trick here that I found online that allows us to do this so I am going to open up a code block here and this will be a for loop and we're going to loop over all of the pages and the paginate err so I will say for num in and then page underscore obj dot paginate err to get the paginate err object of our current page and then we can use that page underscore range that we saw before to loop over all of the pages and now let me end this for statement so I'll say IND 4 and then within this for loop so now within this loop we only want to print out the current page and a few pages surrounding the current page so first of all to see if we are on the current page let's put in a conditional here so I will say if the page underscore obj dot number which is going to be the current pages number if it is equal to the number that we were currently on through this loop then that means that the current page should be displayed a little differently than the other pages so we'll just make this one a little darker so first of all let's end this if statement and if and within this if statement let me grab one of these other anchor tags to go off of so I'll grab that one and paste this in now first of all since this is the current page we don't want this to be an outline we just a solid button and instead of the page going to page one we instead want this to go through whatever number we are currently on through in the loop now if it's a if this doesn't make sense yet I know that this is kind of confusing but once you actually see this in the site and then compare it back to the code then you'll be like oh okay I see what we were doing there so the text that we want to be displayed on this button is just going to be the number on through the loop so now that is what

### [16:50](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1010s) Page Filters

handles the current page when we see it through the loop and now we just want to print out a few pages that surround this current page and to do this we can use a couple of Django template filters so I'm going to put in an elf's statement here and this is actually going to be an L if so I'll say L if the num that we were on that we are on through the loop if that is greater than the page underscore obj dot number and then I'm going to use a filter here so that is that vertical bar tab and we want to add now they don't have a subtract so we have to say add and we want to add a negative three so basically what this is saying as we're looping through our page range this is saying if the number that we're currently on is within three previous pages then we want to print it out and we want to get all of the pages within the three pages so I'll also say and I'm just going to copy this part here and

### [17:56](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1076s) Next Page

paste that in and I'll say if the current number that we're on through the loop is less than the current page number and then add three then we will also print out a link to that page as well and we are very close to being done here so that we can see what this actually looks like in the browser because I know that this is confusing especially just to look at when you're not actually doing it so since this isn't the current page I'm going to give this an outline of BTN outline info and okay finally if the page has next pages then I'm also going to print out an option for them to go to just the next page and also the last page so that they can jump directly to the last page so I'm going to copy this section up here because it's going to be fairly similar and after our for loop in here I'm going to paste that in and now we'll say if the current page object has next then we'll want to have a link to that next page so for the text on that button I'll say next and then for the page that we want to link to we can say page underscore obj dot next underscore page underscore number and save that and finally we want to also give them a link to the very last page so on this link I will say last and for the page that we want to link to we will just say page underscore obj and then we'll access the paginate err object and then we will access the num underscore pages so if there are 30 pages then this will say you know that this page is equal to 30

### [19:43](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1183s) Page Count

okay and if I typed all of that out correctly so let me see if I can fit all of this in so everything that is on the screen here is what we just typed in and I don't think I can fit at all so that's as much as I can get in there okay so I know that was a lot of if statements but if you were at all confused with any of that it'll probably make more sense once we see how this actually works on the front end and then if you want to modify you know how we're displaying the pages in any way then you can go back and change this however you'd like so now let's save this and open this up

### [20:15](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1215s) Demo

in our browser and see how this looks so first of all our dev server is still running so that's good and now let me reload the home page okay so this is what all of that logic did for us so we are currently on page one so we can see that is styled differently that is just a solid button and page one doesn't have any previous pages so we can see that we don't have a link to go to a previous page or the very first page but and then it also puts out page two and three since are close to one now we also have a next link here that will just take us to page two or we can go to the very last page by clicking on last so if I just go to page three actually let me go to like page seven or so to where we're right in the middle okay so if I go to page seven we can see that now we have previous pages so we can either go to the very first page so page number one we can go to the previous page which is page six and we also have page seven which is a solid color and this is what that filter did when we printed out the pages that were within three pages previous and three pages next so we can see that just to print out some of the nearby pages it prints out five six before and then eight and nine afterwards and we still have the next pages so we can go to the next page or we can simply go to the last page so hopefully after seeing that demo on the front end then you'll be able to go back to this code that we just wrote here and kind of make more sense of that okay and that will actually do it for our pagination so the pagination is now done so now that that's done let's change the post per page back to a higher number because having to post per page is kind of silly so I was only using that for a demo so I think five post per page would actually look pretty good so to do this we just need to go back to our views so I still have this open and change paginate by equal to something larger so you can do five or ten if you'd like so I'll do five and then go back to our home page here and now five posts and if we scroll down then we can see that our pagination is still working and now it says that our last page here is actually just going to be page six so it looks like all of that is still working so that's good okay so now there's one more thing that I'd like to do before we finish up this video now if we look at our home page here then we can see that the user name of the user who made the post is currently a link but it doesn't go anywhere so if I click on these and it's just a dead link so let's build a route that will display only the posts from that particular user when you click on that link and if the user has a bunch of post then we want those to be paginate ado it's going to be very similar to our home page list view that we currently have but we're just going to filter that list by that user so let's go ahead and see what this looks like so I'm going to open up our views and like I said this is going to

### [23:10](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1390s) User Post List View

be very similar to our post list view that we're using for our home page so let's just copy that so I'm going to copy that and right underneath it I will paste that in and now let's make a view called user post list view and for the template name here let's just create a template called user underscore post dot HTML so currently this will still list all of the posts from our post model but we want to add a filter to this that only gets the posts from a certain user and that is going to come directly from the URL so when we create a new URL pattern for this well specify the username and the URL path itself so we'll set that whenever we create the URL pattern here in a second but for now let's just assume that we have a username variable passed into the URL so in order to modify the query set that this list view returns we can override a method called get underscore query underscore set and change the query set from within there so let's do that so down here I'm going to say def get underscore query underscore set and this takes self as the first argument and now we want to get the user associated with the username that we're going to get from the URL so at this point if that user doesn't exist then we'll want to return a 404 telling the user that page doesn't exist and I think that's better than returning an empty page for anything that they just type into the URL and to do that we can use a shortcut called get object or 404 and as the name implies there it will get an object from the database if that object exists and if it doesn't exist then it'll just return a 404 so first we need

### [24:57](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1497s) Import Django Shortcuts

to import that and that is from Django shortcuts so we'll just go up to the top here and we're already importing render from Django shortcuts so now we just need to also import get underscore object underscore or underscore 404 so now let's go back down and also looking at the URLs here we actually haven't imported the user yet either and since we're going to be using that user model we need to also import that so I will also import that user and we've seen this a couple of times now it is from Django dot contrib dot auth dot models import user and now we can use those

### [25:38](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1538s) Import User

imports to grab the user so down here in the method that we just created that is right here get query sets we can say user is equal to get object or 404 and we want to get this object from that user model and the user that we want to get is a user with a username equal to and now we want to get the username from the URL and to do that we can say self dot Korg's dot get and kwargs are going to be the query parameters and we can get the username from the URL so now if that user exists then we will capture them in that user variable if they don't exist then it's just going to return a 404 so now we can limit our results for this ListView by finishing our post query so now we can simply say return post dot objects filter and we want a filter post that have an author equal to that user that we just got now there's actually one more thing that we need to do here now since we're overriding the query that this ListView will be making then our order by that we set up above here will also be overridden to so we can just remove that and instead we'll just add it directly to our query so to do an order by directly on a query right here at the end we can just say dot order underscore by and we want to order by the same thing that we had before so that minus date underscore posted so returning that filtered post query and our get query set method is what will limit our posts on that page to that specific user that has their user name as the parameter and the URL okay so now let's actually create that path in our URL patterns that contains the user name parameter so we want to open our blog URLs so within our blog

### [27:45](https://www.youtube.com/watch?v=acOktTcTVEQ&t=1665s) Open Blog URLs

app here I'm going to open our blog URLs and first we need to import that view that we just created and these are all of our views here so I'll just add on to this and that was user post list view and now I'm going to create a path where we pass in the user that we want posts from into the URL so I am just going to copy one of our default paths here so I'll just get the post list view path here and I will just put this right after our home page so now we'll say that if they navigate to user ford slash and then the username so again we'll put in these angle brackets here and we can use user name as the URL variable now just like with our primary key here we can specify what kind of data type this is going to be so we can say that a string okay and the view that we want to handle this path is going to be that user post list view and then the name that we want to use here let's just use user - post okay so now we have the view and we have the URL pattern now let's just create that template so we said in our view that we would name that template user underscore post dot HTML so within our blog templates I'm going to create a new template here and call this user underscore post dot HTML and this is going to be very similar to our home page so I'm just gonna use that as the starting point so I'm going to open our home page here and copy that and we want to keep all that pagination logic in there too because our user post page can be paginate adapt enough posts so the difference here between this and the home page will be that I'll add a heading at the top specifying that this is this user's page so right below the content block here I'm just going to put in an h1 tag and within the h1 tag I'll just say posts by and then we will access an attribute here and to get that user name from the URL we can just say view dot quarks dot user name and that will get the username that is passed into the URL and now let's also print out how many posts this user has so within some parentheses here we'll put the total number of posts that this user has so we'll put in our curly brackets here now how can we do this so one way that we can do this would be to get the current paginate err page so page underscore obj and then get the paginate err object from there and then access the dot count attribute and will return the total number of objects along all of the pages in that paginate err so if you have you know 30 pages of two objects then this will return a count of 60 okay so with that in place let me also just give this a quick class here so I'll set a class equal to and I just want to give this a margin bottom so I'll say MB - 3 now the post for loop will stay mostly the same but a couple of things are going to change so we can actually set the href for the user now to go to the user post route that we are creating right now so right here is where we're printing out the post author and we can see that this link is dead so let's actually let this link to this users page so we will put in a code block here and we'll say that this is a URL and we called that URL user - posts and the username that we want to link to for this route is going to be the username of this author so we will say post dot author dot username and save that and we're actually going to have to change that in our home and post template as well and I know that having repeated code in multiple locations isn't the best practice but we'll fix that in a future video when we see how to use sub templates for repeated sections like this but for now let's just finish this up so we need to add those links to this user route to our home page and our post detail template as well so let's do that so I'm just going to copy this URL here so the beginning of this code block to the end and I know that this posts author has a link in the home page as well so in our home template I'm going to scroll up to where we have the link for this post author and now we'll just post that in so a URL to user post using that post author username and save that and we also want to set this in the post detail template as well so we can see here this is where we're printing out the author that link is currently dead we will paste that in for the user post user name and actually almost made a mistake here this is in the post detail template remember this is called object so let's say object dot author dot user name okay so what those changes let's save everything and then open this in the browser and try to see post created by a single user so I will save all of that and check our dev server is running so now let's reload our home page here and now let's click on this query MS user and see if we can go to their specific page so now we can see this says post by query MS twenty-eight total so let's see if that's right if I go to the last page here okay so actually this isn't right now something is not returning properly I think twenty-eight posts is the total number of posts that we have on the entire blog right now and plus we can see that this is returning test user posts as well this should only be posts from this specific user so it's getting the username correctly from the URL but something must be wrong with the query set that we're getting back so let's go check that so I'm going to open up sublime and go to our views and so we have our get query set method here now this is my fault this query set is actually one word so it should be get underscore query set and so if I save that should solve our problem so sorry about that so now let me go back to our page and or I'll just click on this user again so now if I well now it looks like we have another error here so this says query set object has no attribute order a by so I spelled order by wrong sorry about this guys I usually don't make this many mistakes so in the views here I misspelled order by you all probably notice that as I was typing it out so let me save that everything else looks good let's reload this and the browser here so let me just reload this page okay so now this is looking more like it so now it says post by query MS 18 so that is less than 28 so it is doing some kind of filtering there and it looks like these are only post by query MS so if I go to the last page here then there are three on the last page so this is the fourth page so that means that there would be three pages of five so 15 and then 16 17 18 so that total is correct so this is a nice feature to add to a blog application like this because you know if you're going through and reading an article maybe you'll click and read this article here if you like the article maybe you want to see more by that author so now we can just go click on the author and it takes you to all of the posts by them so we can see here post by test user a total of 10 so that should be two pages and it is two pages of five and also this make sure that we get a 404 page for users that don't exist so if I go to just some gibberish page here then we can see that we get a 404 for a user that doesn't exist so that is good so we can see that these user pages are working well and that we have pagination working for the post on these pages also okay so I think that it's going to do it for this video I hope that now you have a good idea for how you can get pagination working on your website and the different ways in which you can create the links and handle the logic for those and your application also we learned how to create new list views with custom filtered queries and created a useful route for posts written by specific users in the next video we'll be learning how to send emails and how we can use that to reset a user's password but if you have any questions about what we covered in this video then feel free to ask in the comment section below and I'll do my best to answer those and if you enjoy these tutorials and would like to support them then there are several ways you can do that the easiest ways to simply LIKE the video and give it a thumbs up and also it's a huge help to share these videos with anyone who you think would find them useful and if you have the means you can contribute through patreon and there's a link to that page in the description section below be sure to subscribe for future videos and thank you all for watching

---
*Источник: https://ekstraktznaniy.ru/video/12104*