Django開發踩坑(一)

Aliancn發表於2024-04-09

autoescape

控制當前的自動轉義行為。該標籤以 onoff 作為引數,決定塊內是否有自動轉義行為。此區塊以 endautoescape 結束標籤關閉。

示例:

{% autoescape on %}
    {{ body }}
{% endautoescape %}

Django中自定義tag的使用

在 Django 中,你可以透過建立一個自定義的模板標籤來實現 get_direction。以下是建立自定義模板標籤的步驟:

  1. 在你的 Django 應用目錄下建立一個名為 templatetags 的目錄。
  2. templatetags 目錄下建立一個 Python 檔案,例如 my_tags.py
  3. my_tags.py 檔案中,你需要匯入 django.template,然後建立一個繼承自 django.template.Library 的例項。
  4. 在這個例項上,你可以使用 @register.simple_tag 裝飾器來定義你的自定義模板標籤。

以下是一個簡單的示例,定義了一個 get_direction 標籤,它返回一個字串 "north":

from django import template

register = template.Library()

@register.simple_tag
def get_direction():
    return "north"

然後在你的模板中,你需要載入你的自定義模板標籤,然後就可以使用它了:

{% load my_tags %}

{% get_direction as direction %}

這樣,direction 變數就會被賦值為 "north"。你可以根據你的需求修改 get_direction 函式的實現。

請求的方法判斷

在 Django 中,你可以透過檢查 request.method 來判斷請求的方法是 GET 還是 POST。request.method 是一個字串,它表示請求的 HTTP 方法。如果請求的方法是 GET,request.method 的值將是 'GET';如果請求的方法是 POST,request.method 的值將是 'POST'。

def someView(request):
    if request.method == 'POST':
        print('post')
    return HttpResponse('post')
  	else:  # 處理 GET 請求
        print('get')
    return HttpResponse('get')

Get 方法的引數獲取

在 Django 中,你可以透過 request.GETrequest.POST 來獲取請求的引數。這兩個屬性都是 QueryDict 物件,它們提供了一種方便的方式來訪問所有的 HTTP 引數。

如果你想獲取 GET 請求的引數,你可以使用 request.GET。例如,如果你的 URL 是 /myview/?param=value,你可以這樣獲取 param 引數的值:

def my_view(request):
    param_value = request.GET.get

圖片載入

在 Django 模板中,你可以使用雙大括號 {{ }} 來插入變數。在你的例子中,如果你想使用一個變數作為 img 元素的 src 屬性,你可以這樣做:

<img src="{{ item.avator }}" class="img-fluid border-radius-md" />

在這個例子中,item.avator 是一個變數,它的值應該是一個圖片的 URL。這個變數的值將被插入到 src 屬性中。

請注意,這個變數需要在你的檢視函式中被傳遞到模板。例如,如果你的檢視函式是這樣的:

def my_view(request):
    discussion = [
        {'avator': '/static/images/avator1.jpg'},
        {'avator': '/static/images/avator2.jpg'},
        # ...
    ]
    return render(request, 'my_template.html', {'discussion': discussion})

那麼在模板中,item.avator 將會是每個字典中 'avator' 鍵對應的值。

{% url %} 使用

{% url %} 是 Django 模板語言中的一個標籤,它的作用是生成一個 URL。這個標籤接受一個檢視函式的名稱作為引數,並返回對應的 URL。

在你的例子中,{% url 'community:discussion-create' %} 將會生成一個指向 discussion-create 檢視函式的 URL。這個檢視函式應該在你的 community 應用的 urls.py 檔案中定義。

這個標籤非常有用,因為它允許你在模板中生成動態的 URL。如果你在 urls.py 檔案中更改了 URL 的模式,你不需要在模板中更改 URL,因為 {% url %} 標籤會自動生成正確的 URL。

你可以在模板中的任何地方使用 {% url %} 標籤,例如在連結的 href 屬性中:

<a href="{% url 'community:discussion-create' %}">建立討論</a>

在這個例子中,點選連結將會導航到 discussion-create 檢視函式對應的頁面。

aria-controls 和 aria-selected 屬性的作用

aria-controlsaria-selected 是 ARIA(Accessible Rich Internet Applications)規範中定義的屬性,用於提高網頁的可訪問性。

  • aria-controls:此屬性用於建立控制元素(如按鈕或連結)與被控制元素之間的關係。被控制元素的 ID 應該作為 aria-controls 屬性的值。例如,如果一個按鈕用於開啟一個對話方塊,那麼這個按鈕的 aria-controls 屬性應該設定為對話方塊的 ID。

  • aria-selected:此屬性用於表示一個元素是否被選中。這對於可選的元素(如選項卡、列表項等)非常有用。aria-selected 的值可以是 'true' 或 'false'。如果元素被選中,aria-selected 的值應該是 'true';否則,應該是 'false'。

在你的程式碼中,aria-controlsaria-selected 屬性用於建立選項卡式的導航選單。每個選項卡連結到一個特定的元素(由 aria-controls 指定),並透過 aria-selected 屬性表示它是否被選中。這樣,螢幕閱讀器使用者可以更容易地理解和操作你的網頁。

選項卡

使用了 Bootstrap 的 Tab 元件來建立一個選項卡式的導航選單。每個 <a> 標籤都有一個 href 屬性,該屬性的值以 # 開頭,表示它是一個內部連結,連結到頁面上的一個元素。這個元素的 ID 應該與 href 屬性的值(去掉 #)相同。

要控制每個選項卡顯示的內容,你需要在頁面上建立對應的元素,並設定它們的 ID 與選項卡的 href 屬性相匹配。這些元素通常是 <div> 元素,它們包含了每個選項卡的內容。

<ul class="nav nav-pills nav-fill p-1" role="tablist">
                <li class="nav-item">
                  <a class="nav-link mb-0 px-0 py-1 active" data-bs-toggle="tab" href="#hot-tabs-simple" role="tab" aria-controls="hot" aria-selected="true">最熱討論</a>
                </li>
                <li class="nav-item">
                  <a class="nav-link mb-0 px-0 py-1" data-bs-toggle="tab" href="#new-tabs-simple" role="tab" aria-controls="new" aria-selected="true">最新發布</a>
                </li>
                <li class="nav-item">
                  <a class="nav-link mb-0 px-0 py-1" data-bs-toggle="tab" href="#agg-tabs-simple" role="tab" aria-controls="agg" aria-selected="true">最高點贊</a>
                </li>
</ul>

將所有的選項卡內容都放在一個父元素中,併為每個選項卡內容設定 class="tab-pane fade"。然後,你可以使用 Bootstrap 的 JavaScript 外掛來自動切換選項卡內容的顯示和隱藏。

下面是一個例子:

<div class="tab-content">
  <div id="agg-tabs-simple" class="tab-pane fade show active">
    <!-- 這裡是 "最高點贊" 選項卡的內容 -->
  </div>
  <div id="hot-tabs-simple" class="tab-pane fade">
    <!-- 這裡是 "My Profile" 選項卡的內容 -->
  </div>
  <!-- 其他選項卡內容 -->
</div>

在這個例子中,所有的選項卡內容都放在一個 class="tab-content"<div> 元素中。每個選項卡內容都是一個 class="tab-pane fade"<div> 元素,它的 ID 與對應的選項卡的 href 屬性相匹配。

當使用者點選一個選項卡時,Bootstrap 的 JavaScript 外掛會自動顯示與該選項卡 href 屬性相匹配的元素,並隱藏其他元素。這樣,所有的選項卡內容都會佔用同一個位置,每次只顯示一個。

Bootstrap 元素居右

要將元素靠右,你可以使用 Bootstrap 的內建工具類 text-end。這個類會將文字對齊設定為右對齊。你可以將這個類新增到你想要靠右的元素的 class 屬性中。

在你的程式碼中,如果你想將 author div 元素靠右,你可以這樣做:

<div class="author align-items-center text-end">

這樣,author div 中的內容就會靠右顯示了。

如果你只想將 name div 元素靠右,你可以這樣做:

<div class="name ps-3 text-end">

可以使用 Bootstrap 的 d-flexjustify-content-end 類。d-flex 類會將元素設定為 flex 容器,而 justify-content-end 類會將 flex 容器的內容對齊到右邊。

你可以將這兩個類新增到 "author" div 的 class 屬性中,如下所示:

<div class="author align-items-center d-flex justify-content-end">

這樣,"author" div 中的內容就會靠右顯示了。

<div class="author align-items-center d-flex justify-content-end" style="margin-top: 10px;">
	<img src="{{ user_avatar }}" alt="..." class="avatar shadow" />
  <div class="name ps-3">
     <span>{{ user_name }}</span>
     <div class="stats">
     	<small>Posted on {{ post_time }}</small>
     </div>
  </div>            
</div>

button跳轉時傳參

在 Django 中,你可以使用 <a> 標籤和 Bootstrap 的 btn 類來建立一個看起來像按鈕的連結。然後,你可以使用 Django 的 {% url %} 模板標籤來生成連結的 URL,並在其中使用表示式來計算引數。

例如,假設你有一個名為 post 的檢視,它接受一個名為 post_id的引數。你可以建立一個按鈕,當點選時,會跳轉到post_id引數加一的post` 檢視:

<a href="{% url 'post post_id|add:"1" %}" class="btn btn-primary">Next Post</a>

在這個例子中,post_id|add:"1" 是一個 Django 模板表示式,它會將 post_id 的值加一。{% url 'post-details' post_id|add:"1" %} 會生成一個 URL,這個 URL 是 post-details 檢視,引數是 post_id 加一的值。

請注意,你需要在你的檢視和 URL 配置中正確處理這個引數。如果 post_id 加一的值不存在,你的檢視應該返回一個適當的錯誤響應(如 404 錯誤)。

對於 <button> 標籤,你不能直接設定 href 屬性來實現跳轉,因為 <button> 標籤本身不支援 href 屬性。但你可以使用 JavaScript 來實現點選按鈕時的跳轉。

在 Django 中,你可以在按鈕的 onclick 屬性中使用 JavaScript 的 window.location.href 來設定新的 URL。你可以使用 Django 的 {% url %} 模板標籤來生成這個 URL,並在其中使用表示式來計算引數。

例如,假設你有一個名為 post-details 的檢視,它接受一個名為 post_id 的引數。你可以建立一個按鈕,當點選時,會跳轉到 post_id 引數加一的 post-details 檢視:

<button class="btn btn-primary" onclick="window.location.href='{% url 'post-details' post_id|add:'1' %}'">Next Post</button>

在這個例子中,post_id|add:'1' 是一個 Django 模板表示式,它會將 post_id 的值加一。{% url 'post-details' post_id|add:'1' %} 會生成一個 URL,這個 URL 是 post-details 檢視,引數是 post_id 加一的值。

當使用者點選這個按鈕時,瀏覽器會導航到這個新的 URL。

配置media路徑,儲存和讀取 ImageFieldFileField 使用media

在 Django 中,檔案儲存路徑的開頭是否有 / 取決於你想要如何組織你的檔案。

如果路徑以 / 開頭,那麼這個路徑就是絕對路徑。這意味著無論你當前在哪個目錄下,這個路徑都會從你的檔案系統的根目錄開始。例如,/static/images/covers/ 就是一個絕對路徑,它指向你的檔案系統根目錄下的 static/images/covers/ 目錄。

如果路徑不以 / 開頭,那麼這個路徑就是相對路徑。這意味著這個路徑會從你當前的目錄開始。例如,static/images/covers/ 就是一個相對路徑,如果你當前在 /home/user/myproject/ 目錄下,那麼這個路徑就會指向 /home/user/myproject/static/images/covers/ 目錄。

在 Django 的 ImageFieldFileField 中,upload_to 引數通常使用相對路徑。這是因為 Django 會將這個路徑與你在 settings.py 檔案中設定的 MEDIA_ROOT 路徑結合起來,來確定檔案的最終儲存位置。

例如,如果你的 MEDIA_ROOT/home/user/myproject/media/,並且你的 upload_tostatic/images/covers/,那麼檔案會被儲存到 /home/user/myproject/media/static/images/covers/ 目錄下。

在 Django 中,你可以使用 MEDIA_URLMEDIA_ROOT 設定來管理媒體檔案。MEDIA_ROOT 是儲存媒體檔案的檔案系統路徑,而 MEDIA_URL 是這些檔案的 URL 的字首。

在你的 HTML 檔案中,你可以使用 Django 的模板語言來訪問這些檔案。例如,如果你有一個 ImageFieldFileField,你可以使用 .url 屬性來獲取這個檔案的 URL。

假設你的 MEDIA_URL/media/,你的 MEDIA_ROOT/path/to/your/project/media/,並且你有一個 Post 模型,這個模型有一個 cover 欄位,這個欄位是一個 ImageField

在你的檢視函式中,你可以獲取 Post 物件,然後將 post.cover.url 傳遞給你的模板:

def post_details(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    context = {
        'cover': post.cover.url,
    }
    return render(request, 'post-details.html', context)

然後,在你的模板中,你可以使用 {{ cover }} 來訪問這個 URL:

<img src="{{ cover }}" alt="Cover image" />

這樣,當 Django 渲染這個模板時,它會將 {{ cover }} 替換為 post.cover.url 的值,這個值是 /media/ 加上 cover 檔案的路徑。例如,如果 cover 檔案的路徑是 static/images/covers/my_cover.jpg,那麼 post.cover.url 的值就會是 /media/static/images/covers/my_cover.jpg

請注意,為了讓這個 URL 可以正確地指向 MEDIA_ROOT 下的檔案,你需要在你的 urls.py 檔案中新增一些配置。你可以使用 django.conf.urls.static.static 函式來自動地新增這些配置:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... your other url patterns ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

這樣,當 DEBUGTrue 時,Django 就會新增一個 URL 模式,這個模式將 MEDIA_URL 下的所有請求對映到 MEDIA_ROOT 目錄。

redirect使用

在 Django 中,redirect 是一個非常有用的函式,它可以將使用者重定向到一個新的 URL。當你在檢視函式中返回一個 redirect 響應時,瀏覽器會收到一個 302 重定向響應,並被告知新的 URL。然後,瀏覽器會自動請求這個新的 URL。

如果你在 redirect 後重新整理瀏覽器,瀏覽器會重新請求最後一個請求的 URL,也就是 redirect 指向的 URL。這是因為 redirect 實際上是透過傳送一個特殊的 HTTP 響應來告訴瀏覽器去請求一個新的 URL。

這也是為什麼在提交表單後通常會使用 redirect:如果使用者在提交表單後重新整理瀏覽器,瀏覽器會重新提交表單,可能會導致資料被重複提交。但是,如果你在處理表單資料後返回一個 redirect 響應,那麼使用者重新整理瀏覽器時,瀏覽器會請求 redirect 指向的 URL,而不是重新提交表單。

下面是一個例子:

from django.shortcuts import redirect

def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save()
            return redirect('post_details', post_id=post.id)
    else:
        form = PostForm()
    return render(request, 'create_post.html', {'form': form})

在這個例子中,當使用者提交表單時,我們會建立一個新的 Post 物件,並將使用者重定向到這個 Post 的詳情頁面。如果使用者在被重定向後重新整理瀏覽器,瀏覽器會重新請求 Post 的詳情頁面,而不是重新提交表單。

透過ID獲取dom

在 JavaScript 中,你可以使用 document.getElementById 函式來獲取 ID 為 like 的元素。這個函式會返回一個表示這個元素的物件,你可以使用這個物件來讀取或修改這個元素的屬性。

在你的 HTML 中,你可以新增一個 <script> 標籤來包含你的 JavaScript 程式碼。例如:

<script>
    var likeElement = document.getElementById('like');
    // 現在,likeElement 就是 ID 為 'like' 的元素
    // 你可以使用 likeElement 來讀取或修改這個元素的屬性
    // 例如,你可以使用 likeElement.textContent 來獲取或設定這個元素的文字內容
</script>

請注意,你需要確保 document.getElementById 是在 DOM 完全載入後再呼叫的。如果你在 DOM 還沒有完全載入時呼叫 document.getElementById,那麼這個函式可能會返回 null,因為它還找不到 ID 為 like 的元素。你可以將你的 JavaScript 程式碼放在 <body> 標籤的最後,或者使用 window.onload 事件來確保你的程式碼是在 DOM 完全載入後再執行的。

AutoField的遞增邏輯

在 Django 中,AutoField 是一個整數字段,它會自動遞增。每當你建立一個新的記錄,AutoField 就會為這個記錄分配一個新的、唯一的值。這個值是在資料庫中所有的同一型別的 AutoField 值中最大的那個值加一。

AutoField 的自增條件是:

  1. 當你建立一個新的記錄時,如果你沒有為 AutoField 指定一個值,那麼 Django 就會自動為這個欄位分配一個新的值。

  2. 如果你為 AutoField 指定了一個值,那麼 Django 就會使用你指定的這個值。但是,請注意,如果你指定的值已經被其他的記錄使用了,那麼 Django 就會丟擲一個 IntegrityError 異常。

在你的程式碼中,id 欄位是一個 AutoField。這意味著每當你建立一個新的 FileChatMessage 記錄時,Django 就會自動為 id 欄位分配一個新的、唯一的值。

class File(models.Model):
    id = models.AutoField(primary_key=True)
    # ...

class ChatMessage(models.Model):
    id = models.AutoField(primary_key=True)
    # ...

請注意,如果你沒有為模型指定一個主鍵,那麼 Django 就會自動為你的模型新增一個名為 idAutoField

View類檢視中request的使用

在 Django 中,View 類的方法不需要直接傳入 request 引數。當 Django 處理一個請求時,它會自動建立一個 request 物件,並將這個物件作為第一個引數傳遞給檢視函式。在類檢視中,這個 request 物件被儲存在 self.request 屬性中,所以你可以在任何方法中透過 self.request 來訪問這個物件。

self 是 Python 類中的一個特殊引數,它代表類的例項。在類的方法中,你可以使用 self 來訪問或修改這個例項的屬性。

檢視中request.user 的使用

在方法中,self.request.user.is_authenticated 是檢查當前使用者是否已經登入。如果使用者已經登入,那麼 self.request.user 就是一個表示當前使用者的 User 例項,否則 self.request.user 是一個 AnonymousUser 例項。

作為查詢的條件時,使用user的id屬性進行查詢ChatMessage.objects.filter(user=self.request.user.id).order_by('created_at') 是查詢資料庫,獲取當前使用者的所有聊天訊息,並按照 created_at 欄位的值進行排序。這個查詢的結果是一個 QuerySet,你可以將它看作是一個 ChatMessage 例項的列表。

View類檢視中get post的引數

在 Django 的類檢視(Class-Based View)中,get 方法是處理 GET 請求的方法。這個方法的第一個引數是 self,它代表類的例項。第二個引數是 request,它是一個 HttpRequest 物件,代表客戶端發來的 HTTP 請求。

雖然 self 包含了 request 屬性(即 self.request),但是這個屬性是在 Django 呼叫 get 方法之前設定的。在 get 方法被呼叫時,Django 會將 HttpRequest 物件作為第二個引數傳遞給 get 方法。這樣,你就可以在 get 方法中直接訪問 request 物件,而不需要透過 self.request

這是 Django 的設計決定,它使得你可以在類檢視的任何方法中透過 self.request 訪問 HttpRequest 物件,同時也可以在處理 HTTP 請求的方法(如 getpost 等)中直接訪問 request 物件。

jQuery中$的使用

在 jQuery 中,$('list') 會嘗試選擇一個名為 list` 的 HTML 標籤。

如果你想要選擇一個類名為 messages-list 的元素,你應該使用 .messages-list 作為選擇器:

$('.messages-list')

如果你想要選擇一個 id 為 messages-list 的元素,你應該使用 #messages-list 作為選擇器:

$('#messages-list')

在這兩個例子中,.# 是 CSS 選擇器的語法,. 用於選擇類名,# 用於選擇 id。jQuery 的選擇器語法基於 CSS 的選擇器語法。

load_dotenv()載入 .env 檔案

load_dotenv() 預設不會覆蓋已經存在的環境變數。如果你已經在環境中設定了一個變數,那麼 .env 檔案中的值不會被載入。你可以透過傳遞 override=Trueload_dotenv() 來改變這個行為,例如 load_dotenv(override=True)

Django進行登陸的許可權校驗

在 Django 中,你可以使用 login_required 裝飾器來實現這個功能。login_required 裝飾器會檢查使用者是否已經登入,如果沒有登入,它會重定向使用者到登入頁面。

首先,你需要在你的檢視函式上新增 @login_required 裝飾器:

from django.contrib.auth.decorators import login_required

@login_required
def your_view(request):
    # ...

然後,你需要在你的 settings.py 檔案中設定 LOGIN_URL,這是當使用者未登入並嘗試訪問需要登入的頁面時,Django 會重定向使用者到這個 URL:

LOGIN_URL = 'login'

在這個例子中,'login' 是登入檢視的 URL 名稱,你需要將它替換為實際的 URL 名稱。

請注意,login_required 裝飾器只能用於基於函式的檢視。如果你使用基於類的檢視,你應該使用 LoginRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin

class YourView(LoginRequiredMixin, View):
    # ...

在這個例子中,LoginRequiredMixin 應該在其他的 mixin 和 View 之前。

在基於view的類檢視的post方法中校驗登陸

Django 提供了一個 request.user.is_authenticated 屬性,你可以使用它來檢查使用者是否已經登入。

如果使用者沒有登入,你可以使用 redirect 函式來重定向使用者到登入頁面。你需要在你的 post 方法中新增以下的程式碼:

from django.shortcuts import redirect
from django.urls import reverse

class smartAnalysis(View):
    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect(reverse('login'))  # 'login' 是登入檢視的 URL 名稱

        # ... 其他的程式碼 ...

在這個例子中,reverse('login') 會返回登入檢視的 URL,你需要將 'login' 替換為實際的 URL 名稱。

請注意,這種方法不會阻止未登入的使用者訪問其他的方法,例如 getput。如果你想要對所有的方法進行登入檢查,你應該使用 LoginRequiredMixin

Django中model建立陣列欄位

在 Django 的模型中,你可以使用 ArrayField 來建立一個陣列欄位。ArrayField 是 PostgreSQL 資料庫的一個特性,所以它只在使用 PostgreSQL 資料庫時可用。

首先,你需要從 django.contrib.postgres.fields 匯入 ArrayField,然後你可以在你的模型中使用它。例如,如果你想要建立一個字串陣列,你可以這樣做:

from django.contrib.postgres.fields import ArrayField
from django.db import models

class ChatRecord(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    topic = ArrayField(models.CharField(max_length=100), blank=True, default=list)

    def __str__(self):
        return f"{self.user.username}: {', '.join(self.topic)}"

在這個例子中,ArrayField(models.CharField(max_length=100), blank=True, default=list) 建立了一個可以儲存字串的陣列。blank=True 表示這個欄位可以為空,default=list 表示預設值是一個空列表。

請注意,如果你的資料庫不是 PostgreSQL,你需要使用其他的方法來實現陣列欄位,例如使用 JSONField 或者建立一個多對多的關係。

Django ORM 中distinct方法

在 Django ORM 中,distinct() 方法用於從查詢結果中刪除重複的行。

例如,如果你有一個 Blog 模型,每個 Blog 物件有一個 author 欄位,你可能想要獲取所有的作者。你可以使用以下的程式碼:

authors = Blog.objects.values('author').distinct()

在這個例子中,values('author') 返回一個包含所有 author 欄位值的字典,distinct() 確保每個作者只出現一次。

請注意,distinct() 方法在某些資料庫上可能不支援,例如 MySQL。在這些資料庫上,你需要使用其他的方法來刪除重複的行,例如使用 group_by

另外,distinct() 方法只能用於查詢集(QuerySet),不能用於模型的例項。如果你嘗試在一個模型的例項上呼叫 distinct(),你會得到一個 AttributeError

Django ORM 中values方法

在 Django ORM 中,values() 方法用於返回一個包含特定欄位值的字典,而不是模型例項。

例如,如果你有一個 Blog 模型,每個 Blog 物件有一個 titleauthor 欄位,你可以使用以下的程式碼來獲取所有部落格的標題和作者:

blogs = Blog.objects.values('title', 'author')

在這個例子中,blogs 是一個字典的列表,每個字典包含一個部落格的標題和作者。例如:

[{'title': 'First Blog', 'author': 'John'}, {'title': 'Second Blog', 'author': 'Jane'}]

如果你不傳遞任何引數給 values(),它會返回所有欄位的值:

blogs = Blog.objects.values()

在這個例子中,blogs 是一個字典的列表,每個字典包含一個部落格的所有欄位。

values() 方法通常用於當你只需要一部分欄位的值,而不需要整個模型例項時。它也可以用於聚合查詢,例如計算每個作者的部落格數量。

為Form重寫提交事件

你可以透過新增一個 onsubmit 屬性到 form 標籤來新增一個提交函式。這個屬性的值應該是你想要在表單提交時執行的 JavaScript 函式的名稱。

首先,你需要在你的 HTML 檔案中定義這個函式。你可以將它放在一個 <script> 標籤中,例如:

<script>
function submitForm(event) {
    event.preventDefault();  // 阻止表單的預設提交行為
    var topic = document.getElementById('newtopic').value;
    // 在這裡新增你的程式碼,例如傳送一個 AJAX 請求
}
</script>

然後,你可以將 onsubmit 屬性新增到 form 標籤:

<form role="form text-left" onsubmit="submitForm(event)">

在這個例子中,當使用者提交表單時,瀏覽器會執行 submitForm 函式。event 引數是一個 Event 物件,包含了事件的資訊。在 submitForm 函式中,你可以使用 event.preventDefault() 來阻止表單的預設提交行為,然後獲取使用者輸入的主題,並執行你的程式碼。

相關文章