Developing Websites from Scratch using Python and Django -Part 5 (HD)

At this point it's just a roomful of monkeys in tuxes and really how do you manage a roomful oh, sorry, we're back Hi >> Hi >>Hi, welcome back I'm Christopher Harris and that's Susan Auerbach

I'll tell you a story later This is building websites with Python and Django And I need to throw one thing out here that a couple of people pointed out and we have since fired our editors So actually I guess that means we'll have to leave because we're our editors One of the things about doing code in PowerPoint is that PowerPoint, of course, doesn't give you things like syntax checking and so you're just typing away, typing away off the top of your head and you're going this looks right, this looks right and then you send your slides over to your esteemed colleague and your esteemed colleague looks it over and says this looks right and this looks right and you go to do the presentation and everybody in the chat window says hey guys you flip flopped your dollar sign and your caret

>> Well done sir Team effort >> It was good working with you I want to thank you so >> Good catch

>> Gold star You start to anchor to the beginning with a caret and then you end with the dollar sign And I'm now even second-guessing myself one more time >> It was caret star dollar to end So good catch by those in the chat window who were saying hey didn't you get that backwards

Gold star, 1,000 points for you >> 1,000 points, that's generous In any event, we left off at the last module taking a look at our URL setting all of that up and then taking a look at how we can execute code but all we did we just returned back HTML like just string literal And doing string concatenation of HTML, I don't think that's scaleable >> I keep promising that Django is going to be good for lazy coders

As a lazy coder I do not want to be manually writing up plus we've got all the data from a database we want to display >> I don't want to have to start looping through all that

>> There's got to be a better way Christopher is there a better way >> There is That is by utilizing our templates That's where we're going to take a look at

We'll look at the templating system that Django provides and we'll see how we can ensure consistency by using layouts and close everything off by taking a look at forms Now, when we get into templates here, one of the things that you're going to notice is that the templates that Django uses are very similar to Jinja templates, which to a certain extent are similar to how Angular will do things and so forth There's kind of nothing new under the sun So you'll notice a lot of very common concepts and very common syntax between a lot of different environments Django does have its own templating system but it is very similar to Django

So that if you and in fact to the point if you took our Flask course which uses Jinja you'll notice how I just reused, repurposed, recycled a lot of the slides thank you thank you that I used with our Flask MVA as well because again they really are just that similar, which fortunately I think kind of makes life a lot easier So the question then is how do we actually send back complex HTML and the way we're going to do that is by utilizing templates and a template is a collection of placeholders for dynamic content

So our Django template it will look a little bit like this We've got artist details I've got my artist and year formed and we're going to display out the cure and 1978 So there is our very basic template So I provide this and then I say, hey, I want to display the artist name here and I want to display the year they were formed here

That's what the template is all about Now, at its most basic, the template is really just basically HTML They're going to typically exist inside of a folder named templates >> I like it when they do it it's like they put the views under views and models and modelspi settings are in settings and templates in templates

I appreciate it when they do things like that >> There you have it And again you are going to notice that if you are trying to execute some bit of code that it's going to have a similar syntax to Python but it's not Python So it's not actually running Python Now, I've got a very basic little example here

But before I spend too much time on this, I'm going to answer the question that Susan is probably typing away at right now or maybe she's not But the question that typically comes up at this point and came up an awful lot this morning is can I use Bootstrap Now, first of all, seeing all the excitement around Bootstrap warms my heart But the answer is 100 percent absolutely Is that the question

>> No the number two most popular question here is will all this be recorded so that I can go back and review everything and the answer is yes, everything we're doing here live is also recorded and it's usually available at the Microsoft, two weeks, about two weeks after the live event typically you'll be able to access things online and so that just comes up a lot That was the question I was answering But Christopher now that you bring it up is Bootstrap supported inside Django >> As a matter of fact you can use Bootstrap with Django Because Bootstrap is a client-type technology and what you're going to wind up admitting when you use these templates is HTML

In my case I sort of have the simplest of examples for a template but you can absolutely use Bootstrap and in fact we'll see that in the next module Now, if you take a look here at our little template example, the purple is the important part here That all the rest of this is just basic HTML 101 Nothing fancy at all about that The important part is these little placeholders right here, it's the angle angle, right there, and what that angle angle basically means it basically means print, if you will

Which used to be of course short cut as a question mark It means print What we'll have we'll have a variable called name and we're just simply going to say whatever is inside of name print that out And we're going to have a variable called year formed and we're just simply going to say print that out That's what those two curly braces mean

So curly brace, curly brace, there we go, curly brace, curly brace >> Those are some rather disturbing looking curly braces I'll take your word on them >> They'll work Curly brace curly brace what that means it's going to say whatever variable is inside of there put that right there

So it acts as a placeholder for that variable Now, the next question then becomes, well, how do we actually get a variable into there Because if I go back and look at this template, which I absolutely could have just copy and pasted straight from Visual Studio or escape out of this slide and paste this into my copy of Visual Studio and make this work, you might be looking at that and you might be wondering, well, how in the world is name declared and how in the world is year formed declared And the answer is it's actually not declared in the template But in the view I say hand this template a name and hand this template year formed and the template is going to call it

If I say curly, curly name or curly curly year formed, inside my view I do need to pass in those values So that's how that's going to get into there You'll notice nowhere in here am I declaring name, you'll notice nowhere in here am I declaring year formed It's going to be passed in and if it's not there obviously we'll have a problem >> Simply creating placeholders for the values we want to display on the form but we have to make sure when the view calls that template it provides values to put into those placeholders

Didn't give Christopher enough time to get his drink of water You expected me to talk longer My apologies >> I do drink a lot of water That's actually still my first bottle

In any event, Susan also brought up the point a little while ago about what about kind of looping through data So I might execute a query that's going to give us back 20 results How do I loop through all that And fortunately we can do that once again in our template using a syntax that's similar to Python If you looked at this you would go okay that's kind of close to Python, because after all, the 4 X and Y syntax that's straight out of Python

But if you think about Python, the problem we have is the fact that right after that 4 loop I'm supposed to have a colon And everything else is supposed to be tabbed in And that poses a bit of a problem for us because, well, my tabbing is going to potentially be different in HTML versus how it would look inside of Python So I can't really count on tabbing here So how are we going to indicate that we're at the end of our 4 loop

That's where end 4 comes into play And so you'd also notice there's like end dip and everything else And that's one of the things I really do love about this, if you know Python, you can look at that and even if you don't necessarily know what's going on here, you can kind of look at it and kind of figure it out You kind of look at it you go four album and album I know what that means we'll do an end loop and N 4 I know that probably means the end It's relatively intuitive when you stop to look at it

Now, the last little thing worth highlighting you'll notice I said four N in albums that's one time where I will declare something I said here's my variable You notice I can grab a name of something, the exact same way that I would if I was basically anywhere else If I was looping through albums and I want to print out its name in just like the command line I would say album dot name and you'll see that's exactly how I do it here >> In this case albums is the value passed in by the view

>> Exactly This is going to come from the view Perfect point That's going to come from the view All right

So when it comes to using a template, the basic way that we're going to wind up doing that is by utilizing this little render to response And as it turns out there's actually two ways you can send a template down You can either use render to response or you can use render And it really is up to you as to which it is that you want to use Because either will work

They both basically do the exact same thing The main difference between the two as we're going to see is that render wants the request object and you remember that request object That's all the data from the user Render to response doesn't need the request object So really it's a matter of personal preference

And if you don't mind the real quick tangent I know this is going to be a repeat potentially for some people because I talk an awful lot about semicolon but it's sort of like the semicolon at the end You can have it I like them You don't have to Susan doesn't like them

It's up to you There's a difference between render and render to response To me I think it looks a little bit cleaner but whichever All right Now, when you're using render to response, the first parameter is going to be the name of the template, and the second parameter is going to be all of those variables

So let's kind of back the slides up here real quickly and Susan pointed out rightly that albums needs to be passed in, not declared inside of here And then we also mentioned previously that like name and year formed would also need to be passed in and the question is how are they going to be passed in and the way they're going to be passed in is by utilizing this syntax right here we're actually going to pass in a collection So just create the object right here So our variable name, Jason, really, variable name, whatever we want the value to be If I was going to use albums, I would need to say albums colon and then whatever album it is that I might want and then I could go ahead and build it out from there

So let's actually see this in action, shall we? >> Yes because it's always actually different to see it >> Absolutely I'm going to come back to my Solution Explorer there and let me go into my template, there we go, and so you'll notice that we've got a sub folder called templates and we have a sub folder called app Technically we don't have to keep it in there but let's stay with everything else And I'll put it right here

You'll notice I'll create an HTML page Nothing fancy here It's just HTML I'm just going to create a brand new HTML page I'm going to title this as artists

And then now I'm going to go ahead and print out all of my artists So let's just go ahead and say H2 Artists Let's maybe add in a title artists This is sort of HTML 101 here

Let's say UL for unordered lists And let's start using that templated syntax >> Because everything so far has just been straight HTML >> Exactly That's a big point here

And then let's say artists for artists I spelled it right And let's go ahead and say LI And then let's go ahead and end our four down at the bottom there I like to do it right away because I have a propensity to forget those types of things

I also have a propensity to say the word propensity >> I was going to ask if you have a propensity to say the word propensity >> As a matter of fact I do Now what I'll do inside my line item here I'm just going to display out the artist and remember the double curly is going to be our placeholder there, and so now I'm going to say artistname and now there is my placeholder

So all I need to do inside my view is just go get my artists So let's go into our views pi file and let's add in two little options up at the very top I need the render to response if I want to use it I'm going to grab that And I also am going to need my models

So from app models let's just import in all my models Beautiful And so now I'm just going to comment out that line So that way it's still there if you want to use it I'm going to say artists equals artist

objectsall That was what Susan showed earlier >> That populates all the artists from all the artists database >> And I'm going to say return render to response

And now it's going to ask me okay what's the name of the HTML file that's going to be app/artistshtml There we go >> That's the Web page where I'm going to display my results >> Exactly

And now I also need to go ahead and set up my artists variable that we used inside of there We'll say artist colon and then artists And that's it So now if I just save everything, control shift S, by the way, if you're so interested And now let's go ahead and come on over to artists, hit refresh and now you're going to notice that I've got all of my artists listed there

Pretty cool >> That's pretty amazing when you really think about it You've just written code that is going to a database retrieving all the records taking them and displaying them in a template If you break down the amount of code you wrote to do that it's a very small amount This is why Django is popular

>> Exactly I kind of wrote as far as like what I would call true code two lines, basically I mean, the class definition, okay, fine you've got that but that was pretty easy to put together, wasn't it? >> Yeah, there's not too much to it It's funny we had people saying how am I using Django to display the website it's all these pieces together that make it work First we built our model which we said this is the constructive data and the database would be populated now you have somebody enter a URL routed to a method that has been doing a query against a database to get the records back and then displaying those results in a template

>> That is exactly it You hit the nail right on the head there So I was sort of doing a little bit of work in the background here So I am going to change something real quick here I'm just going to update my code, my URL, to use an ID parameter

And just pass in the ID And that really is because I'm trying to keep things as straightforward as possible and I don't want to get into having to deal with things like spaces and URL and encoding and all of that jazz I'm just going to use IDs here for to display out the details of an artist and in turn update this to be ID and clean out the rest of that code right there Okay So let's just make sure that builds right now

So all that I did here while Susan was talking in the background, I just made one last little change here, I said if you give me the ID we'll call artist details So now let's take a look at how we might display out some artist details here So let me go in and create a brand new HTML page, artist details, and then let's go into our little body here Wow No thank you

And let's go in and say stop it Let's go in and say yes, I talked to my computer When it starts talking back, that's when I know it's time to go home >> That's when we get concerned That's when I run

>> Okay In any event, let's go ahead and print something out with the name and then let's go ahead and say H3 and let's say year formed and then curly, curly artist dot year formed Okay There we go So once again kind of very basic

You'll notice that I'm actually going to be using dotted notation off of the artist so we're going to be expecting an artist object back and you'll notice that we can absolutely build that up So sort of like before I can simply say artist equals artistobjectsget and what I'm going to do I'm actually going to use a little bit of syntax that I always think is kind of cool is before we had get and then simply passed in the ID Another way that we could do this is by using the letters PK

And PK is automatically built in PK being short for primary key I was going to make a penalty kick joke >> That's far too complicated >> So now let's go ahead and one more time let's say return render to response and I'm just going to cheat here and let's go ahead and say artist and let's say artist and this was going to be artist details and make sure that I've got all my typing correct

Save everything And let's bring back up my browser and now let's go ahead and say artists slash 1 and there's the cure and let's go ahead and say artist slash 2 and there is REM Now, let's close all of this off because obviously we don't want people navigating directly to artist/1, artist/2 Let's give them links >> Yes because you can't expect a user to know those sort of direct URLs

>> Exactly What I'll do I'll come back here say anchor H ref equals and say forward/artist/ And you'll notice I'm going to put in the curly curly right into an HTML string literal What will end up happening it will start building up the URL for us it will say artist/and the ID of the artist Let's hit save

One more time come back to the browser Now you'll notice I've got my links there and I'll click on cure There's the cure, and I'll click on REM and then there is REM Pretty slick >> That's a much more typical way that a website navigation is going to work

>> Exactly So just like that we've now been able to use our HTML and forgive me for just kind of beating on this drum over and over again because there's been a lot of questions could I use Angular or Bootstrap, absolutely You can use whatever client side technology you want I just wrote plain HTML I did nothing fancy here

I just wrote some basic HTML and away we went I gotta confess something, Susan You know, great for being able to, you know, be data How about sending data back >> You mean if I wanted a data enter user, user entering data or placing an order

Apparently I need caffeine We still want a one-way conversation with user, we need to have two-way to tell them us about new albums recorded by their bands >> Exactly that That's where forms come into play You could, if you wanted to create your own custom forms, you could just go in start saying input type equals text and put type equals e-mail

You could absolutely go in and do that But you know the problem with doing that is it does require additional work because it's going to be up to me to now go in and work with all of that I now have to go in, create the form, I now have to go in and most importantly update the form when there's been changes to the model >> Because if you have you change something from a numerical field to a character field or added a new field the form is not going to magically know you've done that and change everything for you >> Exactly So can Django create forms for us? As a matter of fact, it can It's been to

to create the slide if it couldn't Exactly Django can create forms for us in one of two ways One way we can do this is by creating a form class

And another way to do this is by binding it to a model So the way we could do this with the form class is exactly as you see right now We had to import forms like we had to import models earlier And we create a brand new form and inherent from formsform

Now, Susan >> That looks awfully familiar Looks like the code when we were creating our model

>> Exactly Let's think about a couple of things here When Susan was writing code for her model what she was doing is she was essentially designing a back end database Yes, she was creating a class but she was designing a back end database as part of that process she had to say I want this column to be this, and I want this column to be this Now let's think about we're creating a form what's a form going to need to know

It's going to need to know what values are we going to be asking for and what data types are they supposed to be Well, that's exactly what we're doing right here is we're setting up our form and we're describing all of this data Now, the biggest thing that you want to avoid in code whenever possible is duplication You don't want to repeat the exact same code So if we go back and we look at this again, it's basically the exact same code that Susan wrote

I'll write that again >> That's true >> I'm not going to One of the cool things you can do you can actually bind your form to a model And the way that you do that is by utilizing a model form

And so you're going to notice that once again I'm going to do an import here and you're going to notice I'm going to create a brand new class I'm going to call it in my case artist format I'm going to say model form >> You're inheriting model form >> Instead of form, model form

Exactly And what I'll do is inside my model form I'm going to create a meta class it has to be called meta Take that to magic Define two things Number one I'll define this is the model I now want you to use and then number two, these are the fields that I want you to go grab

So, for example, I probably don't want you to be able to set the ID So I'm not going to list the ID as a field or there are private things >> You don't want people to see all the data

There might be data you use behind the scenes for calculation >> Exactly I don't want to get in start doing all that So now I can just simply say I want a name and year formed and that's it That's all I have to do

Now, you could create this inside the models class or the models file, rather I actually kind of like that because that way I can see this is the model and this is the associated form And in fact let's just get in and do that is where is my models here? There we go I'm just going to you'll notice that right from here we've got Django import forms, and I'm just going to come right down here and I'm going to say class artist form and I'm going to say forms model form There we go And then I'm going to say class meta And then I'm going to say model equals, and then we'll just go ahead and say artist and then I'm going to say fields

there we go Fields equals and then list off all the fields and that's going to be name and then that's going to be year formed That's it

So now I've told Django, hey, I want you to look at the artist class and I've told Django these are the fields that I want editable It really is just that straightforward So I've got the code to generate the form The next question then becomes, you know, maybe why do this Well, the advantage is that the form is automatically going to be updated

Also as we're going to see has the ability to automatically validate the data, but here's what I also really like It even has the ability to just save directly for me, because let's again go back and look at my code here So once again here's my form So it knows how to be a form, right Susan? It also knows about my model, right, Susan? Now our model inherits from model, right >> Correct

>> If it inherits from model it's going to have all the methods from model If we want to put something back into the database what was the name of that method >> Save method called a saved method on that class it would insert new records or make updates to the database >> That's exactly it Cool

It's now going to save that back to the database I know that and Susan knows that and now all of our fine listeners knows that and Django knows that So Django knows on artist that there's in fact a save method and Django also knows how to take all of the data from the form and create an artist for us So behind the scenes it's going to have the ability to look at all the data because we've told it that we need things like a positive integer and a character field with the maximum length of 50 It knows all of that

It also knows that this is going to be bound up to artist so it's going to be able to dynamically create an artist for us and then last but not least it knows that there's a save method and it's going to be able to call that saved method for us So it's able to do all of that automatically for us Now, does that come at a cost? Sort of So one of the things we talked about this morning is the fact that Django can do all of that And it can do all of that magically

Trying to maybe get it to the exact format is going to take maybe a little bit of additional work And I don't want to say that it can't be done and I don't want to give you that impression It just takes a little bit of additional work In fact, I don't even want to say it's difficult It just takes a little extra time

You'll notice there's a great community around Django If you fire up Bing do a search for Django forms and maybe like Bootstrap, which seems to be the magic word of the day, then you can find all sorts of different add ons and plugs and libraries and otherwise that will allow you to use the model form and have it generate the appropriate Bootstrap code for you rather than you having to use the default But I've got an object If I'm going to display something in a browser I need HTML I need to create a bit of HTML

So I need a page that's actually going to host it And there it is in its very simplest form It's just simply going to be form method and post Simply mean it's going to use post to send it up There's my save button

There's my closed form This part right here, this little form, this is actually just like normal template binding So one of the things we're going to do in a few minutes is we're going to actually call this just like we would any normal template and we'll simply say, hey, here is your form So we're just going to go back in and do that Now, one of the things that I mentioned this morning was about security

And in fact a lot of people have been asking, for example, about SQL injection, that's probably the fifth most common question we've gotten today And the thing about Django is that it will automatically take care of SQL injection, automatically clean all of that up for you, so you don't have to worry about SQL injection Well, one of the other challenges that you can run into is somebody spoofing your form So I'm going to send down an HTML form I want you on my site when you submit it I want you to use the form that I gave you Somebody can spoof that

That's where the CRF token comes into play it's going to send down a little hashed value and expect that value back And if it doesn't get that value back, or if it's been tampered with it's going to go aha, wait a minute, you did not come from my site You're using a different form I don't want you sending me data I want you using my form to send me data

What I love about Django, because basically every Web technology gives you the ability to do something like this Django forces you into this If you use a form and you don't give it this token it's going to fail on you And I really like that Because it's really going to enforce that security

On top of that, it's something that's pretty easy to forget And I'm actually going to cheat here I've got the code right there There's no sense in retyping it in So let's go in and create a brand new HTML page and I'm actually just going to call this create and I'm just going to put that form boom right in there

Now, you know, Susan I want you to look at my HTML on there Is there anything on there that says anything on there that says anything about artists >> There's nothing on there that indicates in no way shape or form what I'm going to see >> Can I use that form with album >> I don't see anything that would be different

If I was recreating I think it would be exactly the same code >> There you go That's one cool thing The code to create the form is not here The code to create the form is back here

Let me highlight it Right there That's the code to actually create the form So I can keep reusing this as needed So as long as all I need in this simple little example is a save button, I'm good

Nothing else that I have to do And that's one of the things I really love about this, because if you're having to constantly go back and create forms and edits and so forth, that does become a little bit tedious Now, the last little thing worth mentioning here that is the simplest way to do it And by default what Django will do it will create the form as a table If you wanted to use P elements instead of, paragraph elements or maybe you wanted to use an unordered list instead, then you could actually go in and do that by just going in and saying dot as and then P for paragraph or as UL for an unordered list

I think the paragraph displays a little bit better >> That's again a bit of personal preference that you would want >> Last thing I would mention it's even possible to grab the actual fields and completely customize that HTML So if you did want to do Bootstrap with this you absolutely can and still, by the way, make it dynamic So I could actually loop through all the fields inside the form and I could go ahead and grab the label

I could grab the actual form field I could grab whatever the error placeholder is going to be and I could choose where I want that to appear on the page, if I want to add in my own custom classes for Bootstrap then I absolutely can do that Okay Now, how do we actually use it? Well, the way that we're going to use it is you'll notice that we've got that same definition that we had before so there is our all right There's our define create and then the request So the exact same And now what we're going to do we'll look to see if we're getting a get or post

So on get all that we want to do is just show you the form And you'll notice that the way that we're going to show you the form we'll treat that form like an object and pass it into the template So we're using skills that we already have Susan and I were actually here the other day we were putting together an intro Python course We actually had a physical toolbox here

So if I had a toolbox here I would be reaching into the toolbox and I would be pulling out the two tools that we already have Number one, is the ability to create a template Number two is the ability to put an object into that template That's exactly what we're doing here we're doing that exact same thing number one I'm going to create an object, artist form Number two is I'm going to pass that into the template so there's nothing that's different here

Yeah, I know my slender has render as opposed to render to response That's it Nothing we haven't already learned As far as getting the data back >> We just had a question in the Q&A window about that when the data comes back what happens to the data >> Funny question Now, again, I could if I wanted to start looking through all of the fields inside of the post statement I could

But really I've got better things to do with my time So let's kind of again refresh here Is I created an object or class and I told that class this is how I want you to create the form and I bound it, I bound that to artist So it knows all about artist and it knows how to create an artist On top of that, it also knows how to look at data that's been sent up to the user as part of that form and create the artist object based on that data

So I don't have to read through the form I don't have to read the user data All that I have to do is simply go grab it So you're going to notice this time I'm going to create a brand new form of artist form but this time I'm going to say take the data, this is what the user sent up to us, and use that to create a brand new instance of the artist form That will have in our case the name and year formed and then I'm going to call save

What's cool about save it will automatically check the data for us, make sure it's valid if it's not it would actually throw an error and it will go ahead and save that back to the database So there's nothing else that I need to do So I don't actually need to go to the artist and read values or anything like that I can do that directly off of the form object Boom

>> That was a nice little line there >> Yeah There we go All righty >> Just had an urge to draw

>> Apparently Okay Now once again I'm going to make my life a little bit easier, save a little bit of typing here I'm going to go back into views and I'm just going to add that in I'm just going to put that up at the very top and I'm going to call this artist create

Because you'll kind of notice that I'm using a little bit of a naming scheme here So artist create And I think I've got everything wired up properly I do Cool

And now let's just go in to our URLs and let's go ahead and add in one for create I'm going to put that right up here I'll say URL And my raw And let's go ahead and say artist create and my dollar and let's go ahead and say app views artist create and let's say name equals artist create

Beautiful Okay So once again here's what I did is I created our little HTML placeholder that's going to have the form inside of it I went ahead and I created the there's my models pie I created the form Bound that up to the model and I went ahead and created the view that's now going to be able to store all of that So let's go ahead and one more time hit save

Let's come back over here and now let's go to slash create hit enter It will ask me for the name of the band and let's go ahead and say U 2 and then the year they were formed and >> I have no idea

>> '76 We'll say '76 And then let's go ahead and hit save Oh, I need response redirect Dang it

>> Forgot to import it Can't call something that can't call something from the library you haven't imported

>> No Response Redirect Beautiful Okay

Let me actually go back to artist I just want to show it did in fact create it You'll notice that U 2 is in fact now there So now let's go back into create and let's go ahead and make Susan happy >> There we go

Get some good Canadian music in there Thank you >> Sorry And then I'm going to go ahead and hit save and now you'll notice that we had great big C How about that? U 2 was according to Wikipedia 1976, how about this guy? >> Well done

>> Thank you >> That's 500 points for you All right And a gold star >> And a gold star

Beautiful So in any event, what we saw there is how Django can build that form for us, and I'm just going to wrap all this up by going back to what we said this morning A lot of people are asking why do you use Django, what does Django bring to the table, that's what Django brings to the table is that real quick easy ability to just boom here's my object boom create the form for me and away you go and there's nothing else that you have to do So beautiful All right

1976 I'm very proud of myself With that, I'm going to go bask in the glow of knowing that little bit of trivia off the top of my head Or guessing at it We'll take a break and come back close off with three last things

We'll look at how we can do consistent layouts using our templates We'll take a look at the basics of Bootstrap in five minutes or less, and then we'll finish it all off deploying this out to Azure But until then we'll see you guys in 10