最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

問題描述

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

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

使用Django的ModelForm轉化為表單代碼如下:

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

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

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

解決方式

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

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

    # 對參數(shù)作初始化設置,導致返回之后的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ún)?shù)的數(shù)據(jù)類型,

 # 對關聯(lián)數(shù)據(jù)過濾
        roads = Road.objects.filter(project=p_item) 
        # 生成值,分別對應于 html 中 select->option 設置
        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)

感覺這里應該有更好的方法,嘗試對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

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

相關文章

  • 最新版Anaconda安裝教程

    最新版Anaconda安裝教程

    本文主要介紹了最新版Anaconda安裝教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • python正則表達式判斷字符串是否是全部小寫示例

    python正則表達式判斷字符串是否是全部小寫示例

    python正則表達式判斷字符串是否是全部小寫,大腕參考使用吧
    2013-12-12
  • Python使用貪婪算法解決問題

    Python使用貪婪算法解決問題

    這篇文章主要介紹了Python使用貪婪算法解決問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • jupyter notebook保存文件默認路徑更改方法匯總(親測可以)

    jupyter notebook保存文件默認路徑更改方法匯總(親測可以)

    安裝Anaconda后,新建文件的默認存儲路徑一般在C系統(tǒng)盤,那么路徑是什么呢?如何更改jupyter notebook保存文件默認路徑呢?今天小編就這一問題通過兩種方法給大家講解,需要的朋友跟隨小編一起看看吧
    2021-06-06
  • Python可視化Matplotlib介紹和簡單圖形的繪制

    Python可視化Matplotlib介紹和簡單圖形的繪制

    這篇文章主要介紹了Python可視化Matplotlib介紹和簡單圖形的繪制,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • python取均勻不重復的隨機數(shù)方式

    python取均勻不重復的隨機數(shù)方式

    今天小編就為大家分享一篇python取均勻不重復的隨機數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • java直接調用python腳本的例子

    java直接調用python腳本的例子

    有時需求使用JAVA直接調用python腳本,執(zhí)行一些服務器監(jiān)控的事情。 本文給出一個java直接調用python腳本的例子
    2014-02-02
  • Python異常處理:try、except、else、finally的全面解析

    Python異常處理:try、except、else、finally的全面解析

    在Python中,異常是程序在運行時發(fā)生的錯誤,當Python解釋器遇到一個它不能處理的錯誤時,它會拋出一個異常,異常處理的主要目的是在程序遇到錯誤時,提供一種方法來處理這些錯誤,而不是簡單地讓程序崩潰,本文介紹了Python異常處理:try、except、else、finally的全面解析
    2024-07-07
  • 解決Jupyter 文件路徑的問題

    解決Jupyter 文件路徑的問題

    這篇文章主要介紹了解決Jupyter 文件路徑的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Django框架模板用法入門教程

    Django框架模板用法入門教程

    這篇文章主要介紹了Django框架模板用法,結合簡單入門實例形式分析了Django框架模板標簽、過濾器、模板繼承等概念與使用技巧,需要的朋友可以參考下
    2019-11-11

最新評論

革吉县| 辽阳市| 安平县| 德州市| 保山市| 柏乡县| 阿克陶县| 湘潭县| 卢氏县| 十堰市| 嵊州市| 利辛县| 芒康县| 华容县| 临泉县| 阳泉市| 兴宁市| 金塔县| 绥滨县| 宁城县| 新兴县| 丁青县| 兰西县| 左贡县| 襄汾县| 苍南县| 祁门县| 碌曲县| 江华| 南乐县| 资讯 | 达拉特旗| 盐边县| 比如县| 合水县| 黎城县| 资兴市| 襄樊市| 红安县| 安义县| 临武县|