Django限制表單中ForeignKey對應下拉菜單選項數量的兩種經典方法

2021-03-02 Python Web與Django開發

有朋友問: 假如我們有文章Article和類別Category兩個模型,其中類別和文章是一對多的關係。我們希望某個用戶在使用表單創建或編輯某篇新文章時,表單上類別對應的下拉菜單選項不顯示所有類別,而只顯示用戶自己創建的類別,我們該如何實現?小編我今天就提供兩種經典方法供參考。

如果不出意外,Django模型models.py應該是如下所示:

from django.db import models
from django.contrib.auth.models import User


class Article(models.Model):
"""文章模型"""
title = models.CharField('標題', max_length=200, db_index=True)
author = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE, related_name='articles')
category = models.ForeignKey('Category', verbose_name='分類', on_delete=models.CASCADE, blank=False, null=False)

def __str__(self):
return self.title


class Category(models.Model):
"""類別模型"""
name = models.CharField('name', max_length=30, unique=True)
author = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE, blank=True, null=True,)

def __str__(self):
return self.name

表單文件forms.py應該如下所示。從ArticleForm定義我們可得知,ArticleForm類沒有指定顯示何種類別,所以默認將顯示所有類別。或許你想嘗試修改ArticleForm的定義來將類別選項限定於作者自己創建的類別,但卻找不到真正的突破口。

from django import forms
from .models import Article, Category


class ArticleForm(forms.ModelForm):

class Meta:
model = Article
exclude = ['author',]

那麼答案在哪裡?答案在視圖裡。我們可以在視圖裡對表單ForeignKey對應下拉菜單選項的內容和數量做出限制。接下來我們將分別介紹如何在基於類的視圖和傳統函數視圖裡實現。

基於類的視圖(Class-based Views)

原先的視圖views.py可能如下所示。 你直接使用ArticleForm,沒有對form的各個欄位做出任何修改或調整。

@method_decorator(login_required, name='dispatch')
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'blog/article_form.html'
# Associate form.instance.user with self.request.user

def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)

現在我們就要來見證下奇蹟的時刻了。通過重寫基於類的視圖自帶的get_context_data方法,你可以對form的任何欄位做出修改和限制。比如本例中限定了category對應的queryset僅限於用戶自己創建的類別。models.py, forms.py和模板文件什麼都不需要修改。

@method_decorator(login_required, name='dispatch')
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'blog/article_form.html'
# Associate form.instance.user with self.request.user
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'].fields['category'].queryset = Category.objects.filter(author=self.request.user)
return context

def form_valid(self, form):

form.instance.author = self.request.user
return super().form_valid(form)

傳統函數視圖(Functional Based Views)

如果你喜歡傳統的函數視圖,你會從下面的代碼中獲取啟發。其中最重要的一行代碼莫過於 

form.fields['category'].queryset = Category.objects.filter(author=request.user).


@login_required
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():

article = form.save(commit=False)

article.author = request.user # Set the user object here
article.save() # Now you can send it to DB

return HttpResponseRedirect("/blog/")
else:
form = ArticleForm()
form.fields['category'].queryset = Category.objects.filter(author=request.user)
return render(request, 'blog/article_create_form.html', {'form': form, })

注意:

本例ArticleForm使用的是ModelForm,由模型創建,所以使用form.fields['category']獲取category欄位。如果你是自定義的普通form,應使用form.category獲取category欄位。

小結

如果你想對表單裡顯示的各個欄位的內容或數量做出限制,你應該在視圖裡操作,而不是表單裡操作。記住了嗎?

大江狗

2019.12

相關焦點

  • 在Excel表格中怎樣設置一級下拉菜單選項?
    當我們需要在表格中錄入數據的時候,會不會製作一級下拉菜單選項呢?在表格中使用下拉菜單選項可以幫助我們減少數據的錯誤,今天小編就來教教大家在表格中是怎樣設置一級下拉菜單選項的。方法一:1.首先我們需要打開一個Excel表格,然後在需要設置一級下拉菜單的空白單元格中點擊【數據】看到【數據工具】後,就可以點擊【數據驗證】了。2. 當我們點擊數據驗證之後,就可彈出一個對話框了,在【允許】中設為【序列】,在【來源】中輸入「男,女」就可以的啦!
  • 控制項指南:關於下拉菜單,你知道多少?
    下拉菜單有3種變體,可以根據選擇類型進行分類:單選列表框:用戶只能從互斥選項列表中選擇一項多選列表框:允許用戶選擇多個選項搜索選擇:允許用戶搜索大量選項選項過多時,下拉菜單可能會滾動,具體取決於展開時包含的項目數量。對於下拉列表,選定的選項或默認值在容器框中保持可見,而其他列表項僅在單擊向下箭頭後出現,完成選擇或在下拉列表的外部單擊可將其關閉。
  • Excel輸入內容自動匹配下拉菜單相似選項的兩種方式
    在 Excel 中,如果下拉菜單的選項特別多,選擇起來相檔麻煩,此時如果用輸入內容自動匹配下拉菜單相似選項的方法,則相當容易選擇,因為只需輸入選項中有的某個字,就會自動顯示全部有這個字選項,這樣選項就變得相當少。Excel輸入內容自動匹配選項有兩種方式,一種為需輸入等號,另一種不需,以下就是它們的具體操作實例,實例操作所用版本均為 Excel 2016。
  • 如何在 Word 中給表格增加下拉菜單選項?
    非也,Word 中的表格也可以智能化,比如增加下拉菜單選項。案例 :下圖 1 為公司人員基本信息登記表,請將「性別」和「政治面貌」製作成下拉菜單。效果如下圖 2 所示。選中「性別」列的第一個內容單元格 --> 選擇菜單欄的「開發工具」--> 選擇「控制項」區域的「下拉列表內容控制項」現在單元格中就插入了一個下拉框控制項。2.
  • Excel下拉菜單選項太多了,怎麼做個搜索式下拉菜單
    當Excel表格下拉菜單中的選項非常多時,你就需要一個搜索式下拉菜單。而如果你使用普通的下拉菜單,你要拖到什麼時候才會找到自己想要的數據?還不如不用下拉菜單呢。所以,搜索式下拉菜單是不是挺實用的?製作搜索式下拉菜單的步驟先給原始數據按照姓名排序,接著就和普通的下拉菜單一樣創建序列,在「來源」中輸入公式「=OFFSET($A$1,MATCH(E2&"*",$A$2:$A$281,0),0,COUNTIF($A$2:$A$281,E2&"*"),1)
  • 下拉菜單設計的7個技巧
    本文列舉了下拉菜單設計中的一些要點,並結合多個例子分析了怎麼讓下拉菜單使用得恰到好處。正確地使用下拉菜單是美妙的,它們可以幫助用戶縮小選擇範圍,逆轉屏幕空間並防止錯誤的數據輸入。但是,在某些情況下,下拉菜單的意義不大,反而會對用戶體驗產生負面影響。
  • Django Form表單API詳解
    Form表單檢查數據綁定在《Django表單系統初體驗》中我們使用類的方式創建了一個登陸表單,並在視圖函數中,通過是實例化類對象,成功的創建了一張用戶登錄表單。1) Form.is_boundDjango Form 表單有兩種表現形式:一種是該表單綁定了數據,那麼它就可以實現表單數據的驗證並生成數據渲染的 HTML 表單;而另外一種是未綁定數據的,由於不存在數據所以直接生成空白的 HTML 表單。如果需要綁定數據,需要使用字典的形式傳遞待綁定的數據。
  • 怎樣才能讓 Excel 下拉菜單選項隨數據源自動增減?
    Excel中可以按關鍵字搜索的下拉菜單,兩種做法任你選,如何讓下拉菜單的選項隨之自動增加?案例 :在下圖 1 中的 A 列製作下拉菜單,菜單項內容在 E 列。要求:當 E 列新增內容時,A 列的下拉菜單選項會隨之自動增加新選項。效果如下圖 2 所示。
  • Django Form表單完整使用流程
    表單系統重點知識回顧表單系統的核心是 Form 對象,它將表單中的欄位封裝成了一系列的 Field 和驗證規則,以此來自動生成 HTML 表達標籤。本節中首先使用 Form 對象實現書籍的搜索功能,然後再詳細講解 Form 對象的構成。那麼下面我們首先對前面學過的知識做一下簡單的重點知識回顧。
  • Django表單系統工作原理詳述
    BaseForm 中定義了生成 HTML 與欄位值校驗的方法,而 DeclarativeFieldsMetaclass 則定義了創建 Form 對象的過程。[] for key, value in list(attrs.items()): if isinstance(value, Field): current_fields.append((key, value)) attrs.pop(key) attrs
  • 在.NET MVC5視圖中使用Html輔助方法生成下拉菜單、多行文本框
    @Html.DropDownList()輔助方法表示下拉列表框或下拉菜單,生成HTML中的select標記。在@Html.DropDownList()方法中,每個選項的類型在C#代碼中都是一個SelectListItem類。在SelectListItem類中,有3個屬性是非常有用的,說明如下:Selected表示下拉菜單中被選擇的項。
  • Excel下拉菜單怎麼做?Excel設置下拉菜單的方法
    Excel表格相信大家都用過,為了讓表格更加美觀數據更加清楚,我們就需要對表格進行一些設置了,Excel設置下拉菜單就是我們常會遇到的問題,那麼Excel下拉菜單怎麼做呢?下面分享超級簡單和實用的方法,一起來看看吧!
  • Excel下拉菜單怎麼做?學會這些下拉菜單技巧,從此做表不苦惱
    無論是在工作中還是學習中,都少不了表格的製作。在表格中我們經常會輸入一些數據,為了更加方便的錄入這些數據,學會下拉菜單技巧是比較有用的,今天小編就給大家分享一下一二三級聯動下拉菜單的技巧,有需要的小夥伴可以學習一下。
  • excel下拉菜單怎麼做?教你輕鬆做出一級、二級下拉菜單
    Excel下拉菜單是一個比較實用的技巧,當我們需要輸入重複的內容的時候比較的方便,比如給學生輸入性別、班級、戶籍等等,今天就給大家介紹一下excel下拉菜單的製作方法。首先給大家介紹一下不做excel下拉菜單也可以輸入下拉菜單的方法,就是使用alt鍵+向下的方向鍵「alt+↓」,就可以快速輸入本列輸入過的內容了。
  • Word下拉菜單選項,原來這麼做
    在office軟體上製作下拉菜單,方便我們錄入數據,除了在Excel中製作下拉菜單,也可以在Word中製作下拉菜單選項,下面跟著小Q一起來操作哦~製作完畢效果演示:操作步驟:1、在Word文檔中製作下拉菜單選項,藉助【開發工具】來操作,在Word文檔中沒有顯示該功能的話,進入【文件】-【選項】-【自定義功能區】,將【開發工具】功能勾選即可。
  • 7個技巧,教你做好下拉菜單設計
    本文將依據下拉菜單的屬性,通過舉例來討論下拉菜單的使用場景,希望在設計上對大家有所幫助。正確地設計下拉菜單,可以幫助用戶縮小選擇範圍,減少屏幕其他元素的幹擾,以及防止用戶輸入錯誤的信息。但是,在某些情況下,下拉菜單的錯誤使用將給用戶體驗帶來嚴重的負面影響。在什麼情況下使用下拉菜單至關重要。
  • excel實用技巧:如何構建多級下拉菜單
    說到做下拉菜單,小夥伴們都知道直接使用Excel中的數據驗證就可以實現,但是二級、三級,甚至更多級的下拉菜單,可能就有點蒙圈了。其實用Excel製作三級下拉菜單,一點都不難,它就跟我們平時複製粘貼一樣簡單!不相信?一起來看看文章,你就知道了!
  • excel實用技巧:如何構建多級下拉菜單
    說到做下拉菜單,小夥伴們都知道直接使用Excel中的數據驗證就可以實現,但是二級、三級,甚至更多級的下拉菜單,可能就有點蒙圈了。其實用Excel製作三級下拉菜單,一點都不難,它就跟我們平時複製粘貼一樣簡單!不相信?一起來看看文章,你就知道了!
  • 使用控制項,製作美觀的EXCEL下拉菜單
    EXCEL的下拉菜單可以通過利用數據的有效性,來達到實現下拉菜單的數據有效性。但在於不使用下拉菜單進行大量數據的錄入。而只是使用於查詢等數據操作時,使用Excel的表單控制項來實現下拉菜單比數據有效性的下拉菜單更加有優勢一些。
  • 如此強大的下拉菜單,不看可別後悔?
    可就太說不過去了今天小編就給大家帶來兩種製作Excel二級下拉菜單的方法趕緊學起來吧>首先先了解幾個概念數據有效性又稱數據驗證是對單元格或單元格區域輸入的數據從內容到數量上的限制=INDIRECT("A"&B2)當B2是2時就返回A2的內容當B2是3時就返回A3的內容以此類推製作EXCEL二級下拉菜單的方法