background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Download "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series"

input logo icon
Video tags
|

Video tags

install django with pip
virtualenv
web application development
installing django on mac
pip
django
beginners tutorial
install python
python3.8
python django
web frameworks
windows python
mac python
install python mac
virtual environments
beginner python
python tutorial
djangocfe2021
digitalocean
production
python
django3.2
web apps
modern software development
trydjango2021
Subtitles
|

Subtitles

subtitles menu arrow
  • ruRussian
Download
00:00:00
implement an actual app that will handle
00:00:03
our search feature and then we'll also
00:00:05
be using htmx to actually perform
00:00:08
the search itself so let's go jump into
00:00:11
our project and python manage.py start
00:00:14
app and we'll call it search
00:00:17
in this case it's just simply search i
00:00:20
am not necessarily going to put in
00:00:21
models right now i'm really just going
00:00:23
to be focusing on
00:00:24
the views
00:00:26
and so
00:00:27
the main thing here is just defining a
00:00:29
search
00:00:30
view that takes in a request
00:00:33
and we want to grab the query which if
00:00:35
you remember back it's
00:00:36
request.get.getofq
00:00:40
and then i'm also going to add in
00:00:41
something else in here but before i do
00:00:43
anything further i'll go ahead and say
00:00:46
if request.htmx
00:00:48
then we're going to return render
00:00:50
some sort of response here
00:00:52
some sort of template with some sort of
00:00:54
context
00:00:56
that context in my case will just start
00:00:58
off as just the query
00:01:01
okay
00:01:02
and then the other part is having a
00:01:04
fallback
00:01:06
if it's not a htmx request we still want
00:01:09
to render something
00:01:10
out of that same context
00:01:13
cool
00:01:14
so really these two things aren't that
00:01:16
much different i have been using them
00:01:19
over and over again which is repeating
00:01:20
myself so really i actually can just do
00:01:23
something more like this where we
00:01:25
declare our default template in this
00:01:27
case let's go ahead and do search and
00:01:29
view.html
00:01:31
and then we want to have our
00:01:34
other template in here and this template
00:01:36
would be search
00:01:38
maybe we'll go ahead and do partials
00:01:40
and results
00:01:42
dot html
00:01:44
so let's call this results as well
00:01:47
cool
00:01:48
and so now we'll just go ahead and
00:01:49
return back
00:01:51
that template like that of course in the
00:01:54
request.htmx if i needed to change the
00:01:56
context that's fine but realistically i
00:01:58
just need to change the template and
00:02:00
this is true for our other app as well
00:02:02
all right so let's go ahead and now put
00:02:05
this view into our primary urls
00:02:09
as well as into our settings as far as
00:02:12
the app is concerned so in here we'll go
00:02:14
ahead and add in search
00:02:17
using single quotes
00:02:21
and then we'll go ahead and add in our
00:02:22
url here
00:02:25
so no longer do we need that search view
00:02:27
i'm going to get rid of the article
00:02:28
search view altogether
00:02:30
and then just do from
00:02:31
the search dot views i'm going to import
00:02:35
search
00:02:37
okay so
00:02:38
i don't even think i even used the
00:02:40
article views anymore
00:02:42
none of them in fact so we can get rid
00:02:44
of all of those imports there
00:02:46
i am going to leave the search view here
00:02:48
though and we'll come in and call this
00:02:50
search
00:02:51
and then simply search view
00:02:53
and then we'll go ahead and give it a
00:02:55
name of simply search
00:02:58
okay
00:02:59
so search is going to be available
00:03:00
anywhere so in my template i already
00:03:03
have a block for that form
00:03:05
i don't want that anymore instead what
00:03:07
i'm going to do is i'm going to make a
00:03:09
folder for search
00:03:11
and in here i'll go ahead and do my
00:03:13
search form
00:03:15
so search form.html
00:03:18
and that's going to take place of what
00:03:19
this is so i'll go ahead and cut this
00:03:21
out paste it into my search form
00:03:23
and now use
00:03:25
include
00:03:28
and it's going to be search and search
00:03:30
form dot html
00:03:33
there we go and our search form now is
00:03:35
gonna go to the url of search
00:03:39
okay so no big surprise here hopefully
00:03:41
with a lot of these things
00:03:43
so there's a couple of things i do need
00:03:44
to implement in my search folder here i
00:03:47
need to add in the partials folder
00:03:50
and in there i want to go ahead and do
00:03:52
results.html
00:03:54
this of course would show me all of the
00:03:56
results so really it's going to be for
00:03:58
object in query set or object list
00:04:02
depending on how we name it in our
00:04:03
context variables
00:04:05
i'll leave it in as that
00:04:07
and i'll give it a list element of
00:04:09
simply just object.name
00:04:12
and we'll link that to ahref
00:04:17
and it's going to be object dot get
00:04:20
absolute url hopefully nothing
00:04:22
surprising about these things right
00:04:25
it's something we've already done
00:04:27
several times
00:04:29
and of course now outside of partials
00:04:31
i'm going to go ahead and create the
00:04:32
results
00:04:34
let's call it results view actually so
00:04:36
revo results view and then just simply
00:04:38
results
00:04:39
so of course in the results view we'll
00:04:40
go ahead and extends
00:04:42
base.html
00:04:44
and then we'll go ahead and do our block
00:04:45
content
00:04:49
and
00:04:51
and block
00:04:53
and naturally we'll go ahead and include
00:04:55
our search
00:04:56
partials
00:04:58
and results.html
00:05:02
okay so far so good and our results here
00:05:05
one other thing i want to do is add in a
00:05:08
item for empty so if the query set is
00:05:11
empty
00:05:12
we'll go ahead and say no results found
00:05:17
cool
00:05:18
so
00:05:19
now in our base.html we've got our html
00:05:21
here
00:05:22
our view we just needed to change the
00:05:24
actual template that was being used
00:05:26
for the primary template so that's
00:05:28
results
00:05:29
view now
00:05:31
search results view okay so let's go
00:05:34
into our home page and let's do a quick
00:05:35
search and i'll just say hello world hit
00:05:38
enter and i've got no results found cool
00:05:40
so naturally there's no results found
00:05:42
for several reasons the biggest one uh
00:05:45
being that there is no query set
00:05:48
so how are we going to go about doing
00:05:50
this well there's several different ways
00:05:51
on how we can consider doing this but
00:05:53
i'm going to make it fairly simple on us
00:05:55
first
00:05:56
now one of the things that i want to do
00:05:58
is in this input i'm going to go ahead
00:05:59
and say value equals to
00:06:01
request.get.q
00:06:04
just like that what that does is at
00:06:06
least gives me the previous value that i
00:06:08
actually searched so it's actually in
00:06:10
there i think that's actually a good
00:06:12
idea to have
00:06:14
next what i'm going to do is i'm going
00:06:15
to use a select drop down so i'll go
00:06:17
ahead and do select
00:06:19
and type being equal to
00:06:22
well the name actually being equal to
00:06:23
type
00:06:25
and the the options i want to have are
00:06:28
simply
00:06:29
the values of
00:06:31
let's say article
00:06:33
and it's going to be article
00:06:35
this is really just the different model
00:06:36
types i might end up using so article
00:06:39
and recipes
00:06:44
right so in the long run maybe i don't
00:06:45
even use articles but in the short run
00:06:48
this at least gives me some sort of
00:06:50
value that i can drop down and select
00:06:53
notice that type actually comes up in
00:06:55
here
00:06:56
and so what i want to do too is update
00:07:00
which one of these is selected by
00:07:01
default so it sort of pre-fills that
00:07:03
value
00:07:05
now the there are several ways on how to
00:07:07
get around this and one of the things
00:07:09
you might be wondering is why am i hard
00:07:11
coding this form when i have django
00:07:13
model forms
00:07:15
the reason i'm hard coding this form is
00:07:16
just to make it nice and easy on me to
00:07:19
do some of these conditions
00:07:21
so we totally could have it in other
00:07:23
places but when i hard code it in this
00:07:26
case i can still get that get call
00:07:29
anywhere and then i can also render
00:07:31
these things out so in other words this
00:07:32
template does not rely on a view at all
00:07:36
which is important because of how i'm
00:07:38
actually using it right here
00:07:40
okay
00:07:41
so again the template does not rely on a
00:07:44
view
00:07:45
cool
00:07:46
so going back into that search form um
00:07:48
let's go ahead and do a couple things
00:07:50
first off i'll go ahead and say if
00:07:51
request.get.type
00:07:54
is equal to
00:07:55
article
00:07:58
then we'll do something otherwise we'll
00:08:00
do something else
00:08:02
and what i'm doing here is i'm looking
00:08:04
at the request method right and i'm
00:08:06
looking for the type itself
00:08:08
so perhaps it's going to be articles or
00:08:10
article
00:08:11
we can do either one it doesn't really
00:08:14
matter
00:08:15
but what does matter is when we actually
00:08:17
use it
00:08:18
so if the type is article
00:08:22
then we'll just go ahead and say
00:08:24
selected
00:08:26
okay and so i'm just going to copy this
00:08:28
exact same thing for recipes
00:08:33
okay so recipe
00:08:44
and we might actually want these to be
00:08:45
plural because it is
00:08:47
searching
00:08:51
cool so now if i refresh in here it
00:08:52
actually will show me
00:08:55
the correct url and the ability to
00:08:58
change what it is i'm searching in
00:09:01
now of course i could also do something
00:09:03
like all departments
00:09:05
which is not something i'm going to
00:09:06
select just yet right i will put it in
00:09:08
here
00:09:11
for an option
00:09:13
but i'm not actually going to set it up
00:09:15
just yet right so we've got all recipes
00:09:18
and articles okay great so now we need
00:09:21
the actual view to handle this but even
00:09:23
before i put the view in
00:09:25
something we could do potentially is
00:09:28
well what do we want to do here now on
00:09:31
this input type i could
00:09:33
call the action of search i could use
00:09:35
htmx to actually call it so i could use
00:09:38
htmx get here of search as well
00:09:41
or of course i can actually come down
00:09:43
here and use search right and the reason
00:09:45
i want to do it on the input is so that
00:09:47
i can have that type ahead feature
00:09:49
something we've already kind of seen and
00:09:51
that was that hx trigger
00:09:54
and that trigger actually went for key
00:09:57
up
00:09:58
when it changed and we delay however
00:10:01
many seconds i'm going to actually delay
00:10:02
it to 200 milliseconds
00:10:04
and so the reason we want this on the
00:10:06
input has to do with the fact that
00:10:08
it's going to monitor the key up so
00:10:11
every time i'm typing it's doing
00:10:12
essentially a type ahead
00:10:14
but what's hap what's not actually being
00:10:16
included here is this select item
00:10:19
so to include it i can actually come in
00:10:21
here
00:10:22
and say hx dash include
00:10:25
and then i can either i can pass any
00:10:27
sort of css selector here
00:10:30
right to make things easy on me i'm just
00:10:33
going to go ahead and say id equals to
00:10:35
search dash type
00:10:38
and i'll go ahead and use
00:10:40
search type
00:10:42
so now when i actually push this with a
00:10:45
get it's going to also include this
00:10:47
right here
00:10:48
so we can test this out
00:10:50
in our results
00:10:53
we could say something like searched
00:10:55
for
00:10:56
request.get.q
00:11:00
under
00:11:01
request git
00:11:04
and type
00:11:06
and we can even say i think there's a
00:11:08
title case let's try that out
00:11:10
i'll explain that in a moment okay so
00:11:12
it's refreshing here yeah so search for
00:11:15
hello under
00:11:17
article
00:11:18
and maybe we do s
00:11:20
articles
00:11:22
that doesn't work for alls
00:11:24
which is why i don't want all um
00:11:26
also we're not gonna ever implement or
00:11:28
not implement the
00:11:31
method on how to handle all just yet so
00:11:33
okay search for hello world under
00:11:35
articles
00:11:36
and now we search it for
00:11:38
uh recipes so if i search again there we
00:11:41
go
00:11:42
okay so now let's go ahead and make sure
00:11:44
we save everything
00:11:46
and let's give it a shot so our view
00:11:48
should have the htmx going through
00:11:51
just like that and it should be able to
00:11:53
return that based off of that template
00:11:55
okay so let's go ahead and go back to
00:11:57
our home page
00:11:59
and now i'm going to type in let's say
00:12:01
hello world
00:12:03
and recipes
00:12:05
okay
00:12:06
hmm nothing seemed to happen well of
00:12:08
course it didn't happen because one of
00:12:10
the things that we didn't do
00:12:12
in our search form
00:12:14
is we actually don't have any element to
00:12:17
push this to
00:12:19
right we don't have a target
00:12:21
so to do the target i'm going to go
00:12:24
ahead and add a another div class above
00:12:26
this form
00:12:31
and right above the the form we're going
00:12:33
to go ahead and say div id equals to
00:12:37
type ahead
00:12:38
results
00:12:41
okay so now
00:12:44
this search here
00:12:46
hx target and yet again we can use a css
00:12:49
selector in this case i'm using the id
00:12:52
and
00:12:53
it should go in there
00:12:54
okay so we refresh now and i'll go ahead
00:12:57
and do hello world
00:12:59
and there we go it actually is giving me
00:13:01
those exact same results now of course
00:13:02
if i hit submit it still goes there if i
00:13:05
hit enter here it should still also
00:13:07
submit it which we would see with the
00:13:09
refreshes there and our logs
00:13:11
um so this is pretty cool so that's
00:13:13
actually how the timepad works now of
00:13:14
course i need to actually set in results
00:13:16
in the view
00:13:18
something i don't have yet but this
00:13:20
actually is now working pretty well i
00:13:22
think
00:13:23
so let's go ahead and implement the
00:13:25
actual search now before i do there is
00:13:28
something i need to do in my models
00:13:30
for the recipe itself and that is
00:13:33
actually having a search feature
00:13:35
so you may recall back to when i created
00:13:38
search for articles i actually made
00:13:41
this
00:13:43
so we can copy all that i'm going to
00:13:45
copy literally all of it now typically i
00:13:47
don't love just copying and pasting
00:13:49
things willy-nilly
00:13:51
but this is something that is fairly
00:13:54
fundamental to what we are doing and the
00:13:56
reason i made it in this method
00:13:59
was so we can reuse it
00:14:01
so now we'll go ahead and put recipe
00:14:02
manager
00:14:04
recipe query set
00:14:06
and we'll reuse that
00:14:09
and now i'm going to go ahead and say
00:14:12
objects equals to that
00:14:14
okay
00:14:15
and the really the only thing we should
00:14:17
have to import is just q i did import
00:14:20
literally everything but i think q would
00:14:22
be the only one
00:14:24
as far as i know
00:14:25
for the import
00:14:27
so i'll bring that q lookup
00:14:29
right up here as well
00:14:31
okay
00:14:32
so now i should have the search method
00:14:34
on this query set
00:14:35
now the reason i did that is everything
00:14:38
to do with the type so search
00:14:43
type equals to
00:14:44
request.get.get of type
00:14:48
and now
00:14:49
let's import the models we actually want
00:14:50
to search so from
00:14:52
articles.models import article
00:14:56
from recipes.models
00:14:58
import
00:15:01
recipe
00:15:03
okay
00:15:04
and so what i want to do is i want to
00:15:05
map what the search type is to what the
00:15:08
model would be
00:15:09
so search
00:15:11
type mapping
00:15:14
and in this case we're going to do
00:15:15
recipe
00:15:16
is equal to recipe
00:15:19
recipes
00:15:21
is equal to
00:15:22
recipe
00:15:24
and then the same thing for articles
00:15:26
right
00:15:27
and i should probably reverse these
00:15:32
okay
00:15:33
let's put these up here
00:15:36
just like that okay so this search type
00:15:39
mapping now what i want to do is give a
00:15:42
default class i'll call it class with a
00:15:44
capital k
00:15:45
the default class i'll use is recipe
00:15:48
now i'll say if search underscore type
00:15:51
in
00:15:52
this search type mapping
00:15:55
dot keys
00:15:57
then i'll just go ahead and set the
00:15:58
class
00:15:59
that capital k class
00:16:01
equal to that search type
00:16:04
from the search site mapping
00:16:06
okay simple enough
00:16:09
so now we've got this class in here so
00:16:11
it's either going to be the article
00:16:12
class or the recipe class and what do we
00:16:15
know about these things well i can do
00:16:16
query set of that class
00:16:18
again replacing
00:16:20
the actual variable that i used here
00:16:23
with the actual model itself
00:16:24
dot objects dot search
00:16:27
query equals to that query
00:16:30
and now in my context i can bring in the
00:16:32
query set being equal to
00:16:35
that qs
00:16:36
i i definitely do not need query as a
00:16:38
context variable any longer because that
00:16:40
query is coming right from here so
00:16:44
we've already seen it in our templates
00:16:45
we've used it a few times now
00:16:48
right here
00:16:49
right here so we definitely don't need
00:16:51
that as context the template can infer
00:16:53
it itself
00:16:54
so we save this and now we have a fairly
00:16:57
robust search now assuming that we have
00:17:01
the actual model manager set up
00:17:03
correctly on every given model for
00:17:05
performing a search
00:17:07
in this case i do not have it set up
00:17:09
correctly this should be instead of
00:17:11
title it should be name
00:17:13
content it should be most likely
00:17:15
description
00:17:17
right and i can add more lookups to this
00:17:20
still
00:17:21
like let's go ahead and put this in
00:17:23
parentheses here
00:17:26
and parentheses here
00:17:29
and we can separate these out by lines
00:17:31
so they're a little bit easier and more
00:17:33
user-friendly to read
00:17:35
definitely make sure it has a pipe
00:17:37
except for the very last lookup
00:17:40
okay
00:17:42
so now we have at least a little bit
00:17:44
better of a lookup that's more specific
00:17:45
to recipe
00:17:47
one of the things that we should
00:17:49
notice
00:17:50
is in my search results i used
00:17:53
object.name
00:17:54
of course the the actual articles don't
00:17:58
have a field called name
00:18:00
now you may or may not remember this
00:18:02
it's okay if you don't
00:18:04
but they do have the git absolute url
00:18:06
method
00:18:07
so since they don't have one name they
00:18:08
have one for title i can actually come
00:18:11
in here and just say property
00:18:13
and do define
00:18:15
name
00:18:16
and that's going to return self.title
00:18:19
now i think i actually use these things
00:18:21
interchangeably too often it'd probably
00:18:23
be better that i use one or the other
00:18:25
all the time but sometimes that's not
00:18:27
practical but since i actually changed
00:18:30
this on article what i'm going to do in
00:18:32
my recipe is the exact same thing but
00:18:35
for title so just reversing it just to
00:18:38
ensure that if i accidentally didn't change any
00:18:42
of these lookups they it would still
00:18:44
work
00:18:45
now that also might be true for
00:18:46
description and content but i just think
00:18:49
title is like kind of the key one here
00:18:51
because these are the two that i'm
00:18:53
actually going to use in my search
00:18:54
results
00:18:55
okay so let now let's actually see if it
00:18:57
all works
00:18:58
assuming the server is still running
00:19:00
it is
00:19:01
let's go ahead and take a look i'm going
00:19:02
to actually go to
00:19:04
my home page
00:19:06
this time i'm going to go ahead and
00:19:07
search a
00:19:08
taco and i want to search in recipes
00:19:13
now notice that it actually did not
00:19:15
trigger that again right
00:19:17
so it's definitely not triggering it one
00:19:19
more time
00:19:20
so how do we solve that
00:19:22
well
00:19:23
going back into our search form
00:19:25
it shouldn't be that surprising that
00:19:28
it's actually
00:19:29
using these same triggers
00:19:31
right here
00:19:32
but this time instead of including the
00:19:34
search type
00:19:36
what we want to do is include the search
00:19:39
query
00:19:45
okay so we save that
00:19:47
everything else is the same
00:19:49
let's refresh on our home page with
00:19:52
nothing in there
00:19:53
and i'll go ahead and say taco
00:19:55
no tacos under articles hit recipes
00:19:59
uh oh
00:20:01
recipes didn't do anything
00:20:03
so of course it doesn't necessarily work
00:20:05
perfectly in the type of head in this
00:20:07
case so i'll go ahead and submit it
00:20:09
again
00:20:10
and of course i now have those things
00:20:12
showing up
00:20:13
and it does change the location
00:20:16
as to where things are the submit button
00:20:18
is still there
00:20:20
which i think is nice
00:20:22
but of course there's a number of things
00:20:23
that i might consider changing such as
00:20:25
remembering which type that i end up
00:20:28
using
00:20:29
any given time so if i search taco again
00:20:32
this time
00:20:33
now i've got here
00:20:34
so this actually makes sense to where we
00:20:36
might reverse the order of the drop down
00:20:40
and just altogether get rid of this
00:20:43
right
00:20:44
so again it's not necessarily a perfect
00:20:47
method and there definitely is a way to
00:20:49
make this all work with
00:20:50
htmx but it's just something i'm just
00:20:52
not going to get into right now
00:20:54
but really
00:20:55
we refresh in here
00:20:57
go into recipes search a recipe
00:21:01
there's all of our recipes it's in the
00:21:02
type ahead so we didn't change our url
00:21:05
at all it's literally right here so i
00:21:07
can click on one and what do you know
00:21:09
pretty pretty cool
00:21:11
so this also might ring a bell of like
00:21:13
hey
00:21:14
maybe i actually don't want to have the
00:21:16
entire query set coming back in my hdmx
00:21:20
request
00:21:21
maybe i only want a few items in there
00:21:23
so in that case we would actually come
00:21:25
in and say context
00:21:26
of that query set
00:21:28
equals to the qs
00:21:31
and then we can slice it up to let's say
00:21:34
five results
00:21:36
and so that means that it will only give
00:21:37
me five results back instead of
00:21:39
everything which i think is also really
00:21:41
cool because then if we only have five
00:21:44
results we can also change the context
00:21:47
that's coming through
00:21:49
for our rendered template here
00:21:51
to say hey view all in other words let's
00:21:54
go ahead and say context
00:21:55
say
00:21:56
you know htmlx
00:21:58
hmm wait a minute i'm putting context as
00:22:01
hdmx.request.htmatch
00:22:03
what about request.git i used all that
00:22:05
stuff now the next question would be
00:22:07
if you're following my line of thinking
00:22:09
here
00:22:10
in results can we see
00:22:14
if
00:22:15
request.htmx
00:22:18
and
00:22:21
if so
00:22:23
can we actually use these for that
00:22:25
search
00:22:27
so now i'll go ahead and say ahref
00:22:30
equals to well search
00:22:32
and then the q equaling to
00:22:35
this
00:22:37
and then
00:22:39
the type equaling to
00:22:43
this
00:22:46
and
00:22:47
view all
00:22:49
okay
00:22:50
so we're refreshing here let's go ahead
00:22:52
and go to our homepage we'll go recipes
00:22:57
taco
00:22:58
hey what do you know it says view all i
00:23:01
click on it
00:23:02
hey it takes me over to that search and
00:23:05
it has those other items
00:23:07
pretty cool
00:23:08
now if i do that search again i mean i'm
00:23:10
already on that search page so it's not
00:23:12
necessarily showing me that but i think
00:23:14
i think it's like this is hdmx this is
00:23:16
what's really really cool
00:23:18
now one of the things that i haven't
00:23:19
talked about a whole lot i don't think
00:23:21
is these pipes and this right here
00:23:23
that's called a template filter so
00:23:25
there's a bunch of them inside of django
00:23:27
where you can maybe uppercase something
00:23:30
right or you could lowercase something
00:23:32
which in this case it is already lower
00:23:34
case
00:23:35
and there's many many other things that
00:23:36
you could add to this
00:23:38
so feel free to look at the django
00:23:40
template tag filters using a pipe like
00:23:42
that
00:23:43
but this one right here is very similar
00:23:45
to python's
00:23:47
if you use like my string in python it
00:23:50
did title
00:23:52
that's actually what happens here
00:23:54
and what's cool too is you can actually
00:23:56
make those custom ones yourself it's not
00:23:59
something we need just yet but that is
00:24:01
actually a
00:24:02
fairly robust search feature i would
00:24:04
argue
00:24:05
now there are still a lot of downsides
00:24:07
to it and that is how we do this search
00:24:09
type mapping thing what would be better
00:24:12
is just to have one query and have it
00:24:14
search everything
00:24:16
that is computationally possible but
00:24:18
it's it's a lot more challenging to
00:24:20
implement this i think is just like
00:24:23
really simple to implement but now we
00:24:24
have a way to let the users decide what
00:24:27
they're searching the other part about
00:24:29
this is what are users searching most
00:24:32
right so one of the things you might
00:24:33
consider is actually making a model for
00:24:35
search to
00:24:37
monitor both the query and the search
00:24:39
type like they're intentionally looking
00:24:41
at articles more or they're
00:24:43
intentionally looking at recipes more so
00:24:46
what you would end up doing is maybe
00:24:48
changing the default values for this
00:24:50
or you would actually
00:24:52
you know decide to spend more times
00:24:54
creating articles or articles that help
00:24:57
them with recipes i mean it could just
00:24:58
tell you a lot about what people are
00:25:00
looking for
00:25:01
to improve your overall search
00:25:04
altogether so yeah it might be a good
00:25:05
idea to save that
00:25:08
[Music]
00:25:15
you

Description:

71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series Try Django 3.2 is a series to teach you the fundamentals of creating web applications with Python & Django by building a real project step-by-step. ⦿ Playlist: https://www.youtube.com/playlist?list=PLEsfXFp6DpzRMby_cSoWTFw8zaMdTEXgL ⦿ DigitalOcean $100 Promo: https://try.digitalocean.com/cfe/ ⦿ Code: https://github.com/codingforentrepreneurs/Try-Django-3.2 ⦿ Subscribe: https://www.youtube.com/codingentrepreneurs?sub_confirmation=1 ⦿ Setup Video for Python 3 & Django 3: https://www.youtube.com/watch?v=e5o1miB0nyk

Preparing download options

popular icon
Popular
hd icon
HD video
audio icon
Only sound
total icon
All
* — If the video is playing in a new tab, go to it, then right-click on the video and select "Save video as..."
** — Link intended for online playback in specialized players

Questions about downloading video

mobile menu iconHow can I download "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series" video?mobile menu icon

  • http://unidownloader.com/ website is the best way to download a video or a separate audio track if you want to do without installing programs and extensions.

  • The UDL Helper extension is a convenient button that is seamlessly integrated into YouTube, Instagram and OK.ru sites for fast content download.

  • UDL Client program (for Windows) is the most powerful solution that supports more than 900 websites, social networks and video hosting sites, as well as any video quality that is available in the source.

  • UDL Lite is a really convenient way to access a website from your mobile device. With its help, you can easily download videos directly to your smartphone.

mobile menu iconWhich format of "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series" video should I choose?mobile menu icon

  • The best quality formats are FullHD (1080p), 2K (1440p), 4K (2160p) and 8K (4320p). The higher the resolution of your screen, the higher the video quality should be. However, there are other factors to consider: download speed, amount of free space, and device performance during playback.

mobile menu iconWhy does my computer freeze when loading a "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series" video?mobile menu icon

  • The browser/computer should not freeze completely! If this happens, please report it with a link to the video. Sometimes videos cannot be downloaded directly in a suitable format, so we have added the ability to convert the file to the desired format. In some cases, this process may actively use computer resources.

mobile menu iconHow can I download "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series" video to my phone?mobile menu icon

  • You can download a video to your smartphone using the website or the PWA application UDL Lite. It is also possible to send a download link via QR code using the UDL Helper extension.

mobile menu iconHow can I download an audio track (music) to MP3 "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series"?mobile menu icon

  • The most convenient way is to use the UDL Client program, which supports converting video to MP3 format. In some cases, MP3 can also be downloaded through the UDL Helper extension.

mobile menu iconHow can I save a frame from a video "71 - HTMX Typeahead & Search in Django - Python & Django 3.2 Tutorial Series"?mobile menu icon

  • This feature is available in the UDL Helper extension. Make sure that "Show the video snapshot button" is checked in the settings. A camera icon should appear in the lower right corner of the player to the left of the "Settings" icon. When you click on it, the current frame from the video will be saved to your computer in JPEG format.

mobile menu iconWhat's the price of all this stuff?mobile menu icon

  • It costs nothing. Our services are absolutely free for all users. There are no PRO subscriptions, no restrictions on the number or maximum length of downloaded videos.