佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Django表單外鍵選項(xiàng)初始化的問(wèn)題及解決方法

Django表單外鍵選項(xiàng)初始化的問(wèn)題及解決方法

熱門標(biāo)簽:客戶服務(wù) 企業(yè)做大做強(qiáng) 百度AI接口 硅谷的囚徒呼叫中心 語(yǔ)音系統(tǒng) 電話運(yùn)營(yíng)中心 Win7旗艦版 呼叫中心市場(chǎng)需求

問(wèn)題描述

先說(shuō)明一下問(wèn)題的由來(lái):
Django的模型中經(jīng)常會(huì)用ForeignKey來(lái)關(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è)計(jì)路段")
    # 路面層,附加一個(gè)參數(shù) ,指定這個(gè)層的厚度,相對(duì)于底層的厚度
    # 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')

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

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

解決方式

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

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

    # 對(duì)參數(shù)作初始化設(shè)置,導(dǎo)致返回之后的Form驗(yàn)證失敗
    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)用這個(gè)類的方式如下,注意傳入?yún)?shù)的數(shù)據(jù)類型,

 # 對(duì)關(guān)聯(lián)數(shù)據(jù)過(guò)濾
        roads = Road.objects.filter(project=p_item) 
        # 生成值,分別對(duì)應(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>

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

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

為了解決這個(gè)問(wèn)題,另外做了一個(gè)沒(méi)有初始化函數(shù)的表單類來(lái)接收數(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)

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

參考資料

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表單外鍵選項(xiàng)初始化的文章就介紹到這了,更多相關(guān)Django表單初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • django表單中的按鈕獲取數(shù)據(jù)的實(shí)例分析
  • Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作
  • Django 構(gòu)建模板form表單的兩種方法
  • Django form表單與請(qǐng)求的生命周期步驟詳解
  • Django model.py表單設(shè)置默認(rèn)值允許為空的操作
  • Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值
  • Django框架獲取form表單數(shù)據(jù)方式總結(jié)
  • django之從html頁(yè)面表單獲取輸入的數(shù)據(jù)實(shí)例
  • 解決django中form表單設(shè)置action后無(wú)法回到原頁(yè)面的問(wèn)題
  • django-xadmin根據(jù)當(dāng)前登錄用戶動(dòng)態(tài)設(shè)置表單字段默認(rèn)值方式
  • Django給表單添加honeypot驗(yàn)證增加安全性

標(biāo)簽:崇左 山西 長(zhǎng)沙 海南 安康 濟(jì)南 山西 喀什

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Django表單外鍵選項(xiàng)初始化的問(wèn)題及解決方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    龙州县| 芦溪县| 松阳县| 开封县| 五华县| 修文县| 甘南县| 百色市| 甘孜县| 龙江县| 新晃| 特克斯县| 寻甸| 建湖县| 哈巴河县| 刚察县| 鄂州市| 佛坪县| 寻乌县| 清远市| 哈巴河县| 通山县| 三穗县| 崇明县| 宝清县| 丹江口市| 呼玛县| 安泽县| 延津县| 札达县| 洛扎县| 民权县| 东明县| 启东市| 深泽县| 保康县| 买车| 枣阳市| 井陉县| 肥城市| 循化|