欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django表單外鍵選項初始化的問題及解決方法

 更新時間:2021年04月29日 11:13:27   作者:BH78  
這篇文章主要介紹了Django表單外鍵選項初始化的問題及解決方法,需本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,要的朋友可以參考下

問題描述

先說明一下問題的由來:
Django的模型中經(jīng)常會用ForeignKey來關(guān)聯(lián)其他表格數(shù)據(jù)

class MeasureTask(models.Model):
    taskname = models.CharField(max_length=LEN_FULLNAME, verbose_name="任務(wù)名稱")
    road = models.ForeignKey(Road, on_delete=models.CASCADE, verbose_name="設(shè)計路段")
    # 路面層,附加一個參數(shù) ,指定這個層的厚度,相對于底層的厚度
    # road_level = models.ForeignKey(RoadLevel, on_delete=models.CASCADE, verbose_name="路面層")
    level_thick = models.IntegerField(default=0, verbose_name="層厚(mm)")
    # ...

使用Django的ModelForm轉(zhuǎn)化為表單代碼如下:

class MeasureTaskNewForm(forms.ModelForm):
    class Meta:
        model = MeasureTask
        fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
                  'road', 'level_thick', 'step', 'equip', 'comment')

如果不做進一步處理,在網(wǎng)頁中使用這個From時,關(guān)聯(lián)字段會自動轉(zhuǎn)化為一個select控件,里面包含了所有選項,如下圖:

實際應(yīng)用時,需要對關(guān)聯(lián)的字段做一些選擇過濾。期望的結(jié)果如下:

解決方式

在From類中設(shè)置一個初始化函數(shù):

class MeasureTaskNewForm(forms.ModelForm):
    class Meta:
        model = MeasureTask
        fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
                  'road', 'level_thick', 'step', 'equip', 'comment')

    # 對參數(shù)作初始化設(shè)置,導(dǎo)致返回之后的Form驗證失敗
    def __init__(self, road_choices=None, *args, **kwargs):
        super(MeasureTaskNewForm, self).__init__(*args, **kwargs)
        if road_choices:
            self.fields['road'].choices = road_choices

應(yīng)用這個類的方式如下,注意傳入?yún)?shù)的數(shù)據(jù)類型,

 # 對關(guān)聯(lián)數(shù)據(jù)過濾
        roads = Road.objects.filter(project=p_item) 
        # 生成值,分別對應(yīng)于 html 中 select->option 設(shè)置
        choices = roads.values_list('id', 'name')
        dataform = MeasureTaskNewForm(road_choices=choices)
        # dataform = MeasureTaskNewFormShadow()
        return render(request, "mdata/html/measure_task_add.html", locals())

生成的html代碼:

<select name="road" id="id_road" class="form-control">
  <option value="1">北四環(huán)主線</option>
  <option value="5">匝道A</option>
</select>

到這里生成的表單頁面沒有問題了,但是表單提交返回時如果還是用這個From來接收Request數(shù)據(jù),則會出現(xiàn)數(shù)據(jù)校驗失敗的問題

if request.method == "POST":
        dataform = MeasureTaskNewForm(request.POST)
        # 這里將出現(xiàn)校驗失敗的問題
        if dataform.is_valid():
            dataform.save()
        return redirect('mdata:measure_task', pid=p_item.id)

為了解決這個問題,另外做了一個沒有初始化函數(shù)的表單類來接收數(shù)據(jù).

# 影子表單模型
class MeasureTaskNewFormShadow(forms.ModelForm):
    class Meta:
        model = MeasureTask
        fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
                  'road', 'level_thick', 'step', 'equip', 'comment')
if request.method == "POST":
        dataform = MeasureTaskNewFormShadow(request.POST)
        if dataform.is_valid():
            dataform.save()
        return redirect('mdata:measure_task', pid=p_item.id)

感覺這里應(yīng)該有更好的方法,嘗試對Form的初始化函數(shù)做了一些修改,但是沒有成功。

參考資料

https://qastack.cn/programming/813418/django-set-field-value-after-a-form-is-initialized

http://hk.uwenku.com/question/p-vdjpsmjn-bes.html

https://www.itranslater.com/qa/details/2325790729974580224

到此這篇關(guān)于Django表單外鍵選項初始化的文章就介紹到這了,更多相關(guān)Django表單初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python標準庫之隨機數(shù) (math包、random包)介紹

    Python標準庫之隨機數(shù) (math包、random包)介紹

    這篇文章主要介紹了Python標準庫之隨機數(shù) (math包、random包)介紹,本文講解了math包的常用函數(shù),同時給出了random包的使用例子,需要的朋友可以參考下
    2014-11-11
  • Python 內(nèi)置變量和函數(shù)的查看及說明介紹

    Python 內(nèi)置變量和函數(shù)的查看及說明介紹

    今天小編就為大家分享一篇Python 內(nèi)置變量和函數(shù)的查看及說明介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 18個好用的Python技巧分享(建議收藏)

    18個好用的Python技巧分享(建議收藏)

    在這篇文章中,我們將討論最常用的一些python技巧,這些技巧都是在日常工作中使用過的簡單的Trick,小編覺得好東西就是要拿出來和大家一起分享噠
    2023-07-07
  • Python編程實現(xiàn)tail-n查看日志文件的方法

    Python編程實現(xiàn)tail-n查看日志文件的方法

    這篇文章主要介紹了Python編程實現(xiàn)tail-n查看日志文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Pandas DataFrame轉(zhuǎn)換為字典的方法

    Pandas DataFrame轉(zhuǎn)換為字典的方法

    實際開發(fā)中我們可能會遇到一類問題,如何將Pandas DataFrame轉(zhuǎn)換為字典,本文就來介紹一下,感興趣的可以了解一下
    2021-05-05
  • 總結(jié)Python編程中三條常用的技巧

    總結(jié)Python編程中三條常用的技巧

    這篇文章主要介紹了總結(jié)Python編程中三條常用的技巧,包括JSON格式的轉(zhuǎn)換、else語句的活用和setdefault方法的使用,需要的朋友可以參考下
    2015-05-05
  • 簡單了解python調(diào)用其他腳本方法實例

    簡單了解python調(diào)用其他腳本方法實例

    這篇文章主要介紹了簡單了解python調(diào)用其他腳本方法實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 不到40行代碼用Python實現(xiàn)一個簡單的推薦系統(tǒng)

    不到40行代碼用Python實現(xiàn)一個簡單的推薦系統(tǒng)

    這篇文章主要給大家介紹了如何利用不到40行python代碼實現(xiàn)一個簡單的推薦系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 如何使用VSCode愉快的寫Python于調(diào)試配置步驟

    如何使用VSCode愉快的寫Python于調(diào)試配置步驟

    從我的使用經(jīng)驗出發(fā),可以說VSCode用來寫Python真的是再合適不過了,你將體驗到絲滑的編程體驗和無限擴展的可能。而且,如果你的項目是包含多種語言的,比如Web開發(fā),你不必再開多個編輯器和其他工具,因為這一切都可以在VSCode里完成了
    2018-04-04
  • Python抓取Discuz!用戶名腳本代碼

    Python抓取Discuz!用戶名腳本代碼

    這篇文章主要介紹了Python抓取Discuz!用戶名腳本代碼,有需要的朋友可以參考一下
    2013-12-12

最新評論