国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 後端開(kāi)發(fā) Python教學(xué) 使用 HTMX 和 Django 建立待辦事項(xiàng)應(yīng)用程序,部分無(wú)限滾動(dòng)

使用 HTMX 和 Django 建立待辦事項(xiàng)應(yīng)用程序,部分無(wú)限滾動(dòng)

Jan 06, 2025 pm 12:41 PM

這是該系列的第 7 部分,我將在其中記錄我使用 Django 學(xué)習(xí) HTMX 的過(guò)程,其中我們將按照 HTMX 的文檔來(lái)實(shí)現(xiàn)待辦事項(xiàng)的無(wú)限滾動(dòng)功能。

如果您想查看該系列的其餘部分,請(qǐng)查看 dev.to/rodbv 以獲得完整清單。

更新部分模板以載入多個(gè)項(xiàng)目

當(dāng)我們實(shí)作無(wú)限滾動(dòng)時(shí),我們將必須傳回幾個(gè)待辦事項(xiàng)(專(zhuān)案的下一個(gè)「頁(yè)面」)並將它們載入到我們目前擁有的部分範(fàn)本中。這意味著稍微改變我們的部分範(fàn)本的組成方式;目前的設(shè)定如下圖所示,其中部分範(fàn)本負(fù)責(zé)渲染單一待辦事項(xiàng):

Creating a To-Do app with HTMX and Django, part infinite scroll

我們想要反轉(zhuǎn)順序,讓部分圍繞 for 迴圈:

Creating a To-Do app with HTMX and Django, part infinite scroll

讓我們?cè)诠?fàn)本 core/templates/index.html 中執(zhí)行交換:

<ul>



<p>Soon we will get back to the template to add the hx-get ... hx-trigger="revealed" bit that performs the infinite scroll, but first let's just change the view to return several items instead of  one on the toggle and create operations:<br>
</p>

<pre class="brush:php;toolbar:false">... previous code 

def _create_todo(request):
    title = request.POST.get("title")
    if not title:
        raise ValueError("Title is required")

    todo = Todo.objects.create(title=title, user=request.user)

    return render(
        request,
        "tasks.html#todo-items-partial", # <-- CHANGED
        {"todos": [todo]}, # <-- CHANGED
        status=HTTPStatus.CREATED,
    )

... previous code 


@login_required
@require_http_methods(["PUT"])
def toggle_todo(request, task_id):
    todo = request.user.todos.get(id=task_id)
    todo.is_completed = not todo.is_completed
    todo.save()

    return render(
        request,
        "tasks.html#todo-items-partial",  # <-- CHANGED
        {
            "todos": [todo], # <-- CHANGED
        },
    )

檢查內(nèi)容的測(cè)試仍然通過(guò),而且頁(yè)面看起來(lái)相同,因此我們很好地實(shí)現(xiàn)無(wú)限滾動(dòng)本身。

實(shí)現(xiàn)無(wú)限滾動(dòng)

在模板上,我們需要向/tasks 設(shè)定一個(gè)hx-get 請(qǐng)求,其中hx-trigger="revealed" ,這意味著只有當(dāng)元素即將進(jìn)入螢?zāi)簧峡梢?jiàn)時(shí)才會(huì)觸發(fā)GET 請(qǐng)求;這意味著我們希望將其設(shè)定在清單中最後一個(gè)元素之後,並且我們還需要指示要載入哪個(gè)「頁(yè)面」資料。在我們的例子中,我們將一次顯示 20 個(gè)項(xiàng)目。

Creating a To-Do app with HTMX and Django, part infinite scroll

讓我們相應(yīng)地更改模板:

    <ul>



<p>There's an if next_page_number check around the "loading" icon at the bottom of the list, it will have two purposes: one is to indicate when we're loading more data, but more importantly, when the loader is revealed (it appears on the visible part of the page), it will trigger the hx-get call to /tasks, passing the page number to be retrieved. The attribute next_page_number will also be provided by the context</p>

<p>The directive hx-swap:outerHTML indicates that we will replace the outerHTML of this element with the set of <li>s we get from the server, which is great because not only we show the new data we got, but we also get rid of the loading icon.

<p>We can now move to the views file.</p>

<p>As a recap, here's how the GET /tasks view looks like by now; it's always returning the full template.<br>
</p>

<pre class="brush:php;toolbar:false">@require_http_methods(["GET", "POST"])
@login_required
def tasks(request):
    if request.method == "POST":
        return _create_todo(request)

    # GET /tasks
    context = {
        "todos": request.user.todos.all().order_by("-created_at"),
        "fullname": request.user.get_full_name() or request.user.username,
    }

    return render(request, "tasks.html", context)

上面的程式碼已經(jīng)做了改動(dòng),就是按照最新的待辦事項(xiàng)優(yōu)先排序;既然我們期望有一個(gè)很長(zhǎng)的列表,那麼在底部添加新項(xiàng)目並將其與無(wú)限滾動(dòng)混合是沒(méi)有意義的- 新項(xiàng)目最終將混合在清單的中間。

我們現(xiàn)在需要區(qū)分常規(guī) GET 請(qǐng)求和 HTMX 請(qǐng)求,為此我們將只傳回待辦事項(xiàng)清單和部分範(fàn)本。有一個(gè)名為django-htmx 的函式庫(kù),它非常方便,因?yàn)樗褂胷equest.htmx 等屬性和所有hx-* 屬性的值擴(kuò)展了請(qǐng)求參數(shù),但目前這有點(diǎn)過(guò)分了;現(xiàn)在讓我們檢查HTMX 標(biāo)頭,並使用Django 分頁(yè)器處理分頁(yè)。

# core/views.py

... previous code

PAGE_SIZE = 20

...previous code

@require_http_methods(["GET", "POST"])
@login_required
def tasks(request):
    if request.method == "POST":
        return _create_todo(request)

    page_number = int(request.GET.get("page", 1))

    all_todos = request.user.todos.all().order_by("-created_at")
    paginator = Paginator(all_todos, PAGE_SIZE)
    curr_page = paginator.get_page(page_number)

    context = {
        "todos": curr_page.object_list,
        "fullname": request.user.get_full_name() or request.user.username,
        "next_page_number": page_number + 1 if curr_page.has_next() else None,
    }

    template_name = "tasks.html"

    if "HX-Request" in request.headers:
        template_name += "#todo-items-partial"

    return render(request, template_name, context)

我們做的第一件事是檢查頁(yè)面參數(shù),如果不存在則將其設(shè)為 1。

我們檢查請(qǐng)求中的 HX-Request 標(biāo)頭,這將告知我們傳入的請(qǐng)求是否來(lái)自 HTMX,並讓我們相應(yīng)地返回部分模板或完整模板。

這段程式碼肯定需要一些測(cè)試,但在此之前讓我們先嘗試一下??纯淳W(wǎng)路工具,當(dāng)頁(yè)面滾動(dòng)時(shí)如何觸發(fā)請(qǐng)求,直到到達(dá)最後一頁(yè)。您還可以看到動(dòng)畫(huà)「正在載入」圖示短暫顯示;我已將網(wǎng)路速度限制為 4g,以使其可見(jiàn)時(shí)間更長(zhǎng)。

Creating a To-Do app with HTMX and Django, part infinite scroll

添加測(cè)試

最後,我們可以新增一個(gè)測(cè)驗(yàn)來(lái)確保分頁(yè)能如預(yù)期運(yùn)作

<ul>



<p>Soon we will get back to the template to add the hx-get ... hx-trigger="revealed" bit that performs the infinite scroll, but first let's just change the view to return several items instead of  one on the toggle and create operations:<br>
</p>

<pre class="brush:php;toolbar:false">... previous code 

def _create_todo(request):
    title = request.POST.get("title")
    if not title:
        raise ValueError("Title is required")

    todo = Todo.objects.create(title=title, user=request.user)

    return render(
        request,
        "tasks.html#todo-items-partial", # <-- CHANGED
        {"todos": [todo]}, # <-- CHANGED
        status=HTTPStatus.CREATED,
    )

... previous code 


@login_required
@require_http_methods(["PUT"])
def toggle_todo(request, task_id):
    todo = request.user.todos.get(id=task_id)
    todo.is_completed = not todo.is_completed
    todo.save()

    return render(
        request,
        "tasks.html#todo-items-partial",  # <-- CHANGED
        {
            "todos": [todo], # <-- CHANGED
        },
    )

現(xiàn)在就這樣了!這是迄今為止我使用 HTMX 遇到的最有趣的事情。這篇文章的完整程式碼在這裡。

對(duì)於下一篇文章,我正在考慮使用 AlpineJS 新增一些客戶(hù)端狀態(tài)管理,或新增「截止日期」功能。再見(jiàn)!

以上是使用 HTMX 和 Django 建立待辦事項(xiàng)應(yīng)用程序,部分無(wú)限滾動(dòng)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Python類(lèi)中的多態(tài)性 Python類(lèi)中的多態(tài)性 Jul 05, 2025 am 02:58 AM

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍?,指“一種接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類(lèi)型的對(duì)象。 1.多態(tài)通過(guò)方法重寫(xiě)實(shí)現(xiàn),子類(lèi)可重新定義父類(lèi)方法,如Animal類(lèi)的speak()方法在Dog和Cat子類(lèi)中有不同實(shí)現(xiàn)。 2.多態(tài)的實(shí)際用途包括簡(jiǎn)化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪製程序中統(tǒng)一調(diào)用draw()方法,或遊戲開(kāi)發(fā)中處理不同角色的共同行為。 3.Python實(shí)現(xiàn)多態(tài)需滿(mǎn)足:父類(lèi)定義方法,子類(lèi)重寫(xiě)該方法,但不要求繼承同一父類(lèi),只要對(duì)象實(shí)現(xiàn)相同方法即可,這稱(chēng)為“鴨子類(lèi)型”。 4.注意事項(xiàng)包括保持方

我如何寫(xiě)一個(gè)簡(jiǎn)單的'你好,世界!” Python的程序? 我如何寫(xiě)一個(gè)簡(jiǎn)單的'你好,世界!” Python的程序? Jun 24, 2025 am 12:45 AM

"Hello,World!"程序是用Python編寫(xiě)的最基礎(chǔ)示例,用於展示基本語(yǔ)法並驗(yàn)證開(kāi)發(fā)環(huán)境是否正確配置。 1.它通過(guò)一行代碼print("Hello,World!")實(shí)現(xiàn),運(yùn)行後會(huì)在控制臺(tái)輸出指定文本;2.運(yùn)行步驟包括安裝Python、使用文本編輯器編寫(xiě)代碼、保存為.py文件、在終端執(zhí)行該文件;3.常見(jiàn)錯(cuò)誤有遺漏括號(hào)或引號(hào)、誤用大寫(xiě)Print、未保存為.py格式以及運(yùn)行環(huán)境錯(cuò)誤;4.可選工具包括本地文本編輯器 終端、在線編輯器(如replit.com)

如何在Python中產(chǎn)生隨機(jī)字符串? 如何在Python中產(chǎn)生隨機(jī)字符串? Jun 21, 2025 am 01:02 AM

要生成隨機(jī)字符串,可以使用Python的random和string模塊組合。具體步驟為:1.導(dǎo)入random和string模塊;2.定義字符池如string.ascii_letters和string.digits;3.設(shè)定所需長(zhǎng)度;4.調(diào)用random.choices()生成字符串。例如代碼包括importrandom與importstring、設(shè)置length=10、characters=string.ascii_letters string.digits並執(zhí)行''.join(random.c

Python中的算法是什麼?為什麼它們很重要? Python中的算法是什麼?為什麼它們很重要? Jun 24, 2025 am 12:43 AM

AlgorithmsinPythonareessentialforefficientproblem-solvinginprogramming.Theyarestep-by-stepproceduresusedtosolvetaskslikesorting,searching,anddatamanipulation.Commontypesincludesortingalgorithmslikequicksort,searchingalgorithmslikebinarysearch,andgrap

什麼是python的列表切片? 什麼是python的列表切片? Jun 29, 2025 am 02:15 AM

ListslicinginPythonextractsaportionofalistusingindices.1.Itusesthesyntaxlist[start:end:step],wherestartisinclusive,endisexclusive,andstepdefinestheinterval.2.Ifstartorendareomitted,Pythondefaultstothebeginningorendofthelist.3.Commonusesincludegetting

python`@classmethod'裝飾師解釋了 python`@classmethod'裝飾師解釋了 Jul 04, 2025 am 03:26 AM

類(lèi)方法是Python中通過(guò)@classmethod裝飾器定義的方法,其第一個(gè)參數(shù)為類(lèi)本身(cls),用於訪問(wèn)或修改類(lèi)狀態(tài)。它可通過(guò)類(lèi)或?qū)嵗{(diào)用,影響的是整個(gè)類(lèi)而非特定實(shí)例;例如在Person類(lèi)中,show_count()方法統(tǒng)計(jì)創(chuàng)建的對(duì)像數(shù)量;定義類(lèi)方法時(shí)需使用@classmethod裝飾器並將首參命名為cls,如change_var(new_value)方法可修改類(lèi)變量;類(lèi)方法與實(shí)例方法(self參數(shù))、靜態(tài)方法(無(wú)自動(dòng)參數(shù))不同,適用於工廠方法、替代構(gòu)造函數(shù)及管理類(lèi)變量等場(chǎng)景;常見(jiàn)用途包括從

如何使用CSV模塊在Python中使用CSV文件? 如何使用CSV模塊在Python中使用CSV文件? Jun 25, 2025 am 01:03 AM

Python的csv模塊提供了讀寫(xiě)CSV文件的簡(jiǎn)單方法。 1.讀取CSV文件時(shí),可使用csv.reader()逐行讀取,並將每行數(shù)據(jù)作為字符串列表返回;若需通過(guò)列名訪問(wèn)數(shù)據(jù),則可用csv.DictReader(),它將每行映射為字典。 2.寫(xiě)入CSV文件時(shí),使用csv.writer()並調(diào)用writerow()或writerows()方法寫(xiě)入單行或多行數(shù)據(jù);若要寫(xiě)入字典數(shù)據(jù),則使用csv.DictWriter(),需先定義列名並通過(guò)writeheader()寫(xiě)入表頭。 3.處理邊緣情況時(shí),模塊自動(dòng)處理

Python函數(shù)參數(shù)和參數(shù) Python函數(shù)參數(shù)和參數(shù) Jul 04, 2025 am 03:26 AM

參數(shù)(parameters)是定義函數(shù)時(shí)的佔(zhàn)位符,而傳參(arguments)是調(diào)用時(shí)傳入的具體值。 1.位置參數(shù)需按順序傳遞,順序錯(cuò)誤會(huì)導(dǎo)致結(jié)果錯(cuò)誤;2.關(guān)鍵字參數(shù)通過(guò)參數(shù)名指定,可改變順序且提高可讀性;3.默認(rèn)參數(shù)值在定義時(shí)賦值,避免重複代碼,但應(yīng)避免使用可變對(duì)像作為默認(rèn)值;4.args和*kwargs可處理不定數(shù)量的參數(shù),適用於通用接口或裝飾器,但應(yīng)謹(jǐn)慎使用以保持可讀性。

See all articles