国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django中同一頁面中的多表單處理

null1145 / 3551人閱讀

摘要:原文地址關于在同個頁面多個表單提交的問題實際上是項目中遇到的個小問題。實際關于在個頁面提交多個表單的問題實際上問題不是很多只要解決了渲染和提交時處理的問題實際這個問題就迎刃而解了。

原文地址:

http://52sox.com/how-to-handl...

關于在同1個頁面多個表單提交的問題,實際上是項目中遇到的1個小問題。關于這個問題,主要有2個需要解決的問題:

多個表單的渲染問題

多個表單提交時外鍵的處理問題

下面我們分別進行說明。
當時在建模的時候使用了類似如下的方式:

from django.db import models

class Store(models.Model):
    name = models.CharField("名稱", max_length=20)
    first = models.FloatField("首重")
    additional = models.FloatField("次重")
    img = models.ImageField("圖片", upload_to="store/1")

class Depot(models.Model):
    s_name = models.ForeignKey(Store, verbose_name="倉庫")
    src = models.CharField("始發地", max_length=20)
    dest = models.CharField("目的地", max_length=20)
    days = models.PositiveSmallIntegerField("需要的天數")

class Address(models.Model):
    s_name = models.ForeignKey(Store, verbose_name="倉庫")
    country = models.CharField("國家", max_length=20)
    state = models.CharField("省份", max_length=10)
    city = models.CharField("城市", max_length=10)
    description = models.TextField("描述", blank=True)

在這里,1個倉庫的數據主要由3個表組成,分別為它的一些基礎信息,可以配送的范圍、天數及其他一些附加信息組成。然后其頁面如下所示:

多表單渲染

而公司的需求就是我們要在商戶端上讓客戶在創建倉庫時填寫上述的內容,由于我比較懶,而公司給出的時間也不是很充裕,于是直接使用ModelForm來實現,而不需要一一的創建表單了。換句話說,我們要將多個模型表在同1個頁面中渲染出來,對于這樣的問題,主要有4種解決的方案:

在1個form組件中使用多個模型表單類

使用django提供的modelform_factory來解決

使用第3方插件django-betterforms或django-multipleformwizard這樣的插件

使用元類,然后繼承BaseForm進行表單的重寫。

這里我們使用第1種解決方案來實現多個表單渲染的問題。
這里我們在forms模塊下新建3個模型表單類:

from django.forms import ModelForm
from models import Store, Address, Depot

class StoreForm(ModelForm):
    class Meta:
        model = Store
        fields = "__all__"

class AddressForm(ModelForm):
    class Meta:
        model = Address
        exclude = ["s_name"]

class DepotForm(ModelForm):
    class Meta:
        model = Depot
        exclude = ["s_name"]

然后在視圖中引入這3個表單:

from django.shortcuts import render_to_response, HttpResponseRedirect
from django.template import RequestContext
from forms import StoreForm, AddressForm, DepotForm

def store_add(req):
    if req.method == "POST":
       ...
    else:
        sf = StoreForm()
        af = AddressForm()
        df = DepotForm()
    return render_to_response("store_add.html", {
        "sf": sf, "af": af, "df": df,
    }, context_instance=RequestContext(req))

默認情況下,我們先將對應的表單渲染出來先。在這里我們往模板中輸出了多個變量,然后在模板中手動進行如下的處理:

{% csrf_token %} {{ sf.as_p }} {{ df.as_p }} {{ af.as_p }}

在這里,我們在1個表單中輸出多個表單,其頁面如下所示:

可以看到其效果與后臺的頁面相差不是很大,只是沒有對應的樣式而已。

多表單提交外鍵處理

接著我們需要處理多個表單提交時的處理問題。

def store_add(req):
    if req.method == "POST":
        sf = StoreForm(req.POST, req.FILES)
        af = AddressForm(req.POST)
        df = DepotForm(req.POST)
        if sf.is_valid() and af.is_valid() and df.is_valid():
            sf.save()
            df.save()
            af.save()
            return HttpResponseRedirect("store")
    ...

在這里我們直接對這3個表單進行保存,結果出現了這樣1個錯誤。

NOT NULL constraint failed: app_depot.s_name_id

由于我們使用了1個外鍵進行了約束,而使用上述的方式會導致數據表中的s_name_id的字段數值為NULL,從而導致了錯誤。而上述的方式時直接就提交給數據庫了,導致后面的外鍵無法被滿足。為了解決這個問題,我們采用延遲提交給數據庫的方式:

def store_add(req):
    if req.method == "POST":
        ...
        if sf.is_valid() and af.is_valid() and df.is_valid():
            form = sf.save(commit=False)
            sf.save()
            dform = df.save(commit=False)
            dform.s_name = form
            dform.save()
            aform = af.save(commit=False)
            aform.s_name = form
            aform.save()
            return HttpResponseRedirect("store")
    else:
        ...

在這里,我們先讓第1張表先不提交,將其保存為1個變量form中。而第2個張表也先不提交,我們將其實例的s_name修改為之前的第1張表返回的結果,然后再進行保存。這樣我們就實現了多張表的依賴導致的問題了。最后我們使用重定向的方式將成功添加后的頁面跳轉到該商戶的倉庫列表中。
其跳轉后的頁面如下所示:

這樣我們就解決了在1個頁面提交多個表單的問題。
實際關于Django在1個頁面提交多個表單的問題,實際上問題不是很多,只要解決了渲染和提交時處理的問題,實際這個問題就迎刃而解了。重要的是如何拆分問題和解決問題的思路。

參考文章:

http://stackoverflow.com/ques...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38223.html

相關文章

  • Django搭建個人博客:文章標簽功能

    摘要:每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。列表中顯示標簽雖然保存標簽的功能已經實現了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結本章學習了使用來完成標簽功能。 標簽是作者從文章中提取的核心詞匯,其他用戶可以通過標簽快速了解文章的關注點。每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。 好在標簽功能也有優秀的三方庫:D...

    Amio 評論0 收藏0
  • Django 學習小組:博客開發實戰第五周教程 —— 實現評論功能

    摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 通過前四周的時間我們開發了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的 Mode...

    CoderStudy 評論0 收藏0
  • Django 學習小組:博客開發實戰第五周教程 —— 實現評論功能

    摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 通過前四周的時間我們開發了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的 Mode...

    kumfo 評論0 收藏0
  • Cesar競賽平臺項目期總結

    摘要:競賽平臺項目中期總結軟件謝運帷我們小組的選題是大學生競賽平臺項目,經過我們需求分析,原型設計等等步驟,我們終于要開始著手實現這一個龐大的競賽平臺項目。 Cesar競賽平臺項目中期總結 軟件51 謝運帷 2015013185 我們小組的選題是大學生競賽平臺項目,經過我們需求分析,原型設計等等步驟,我們終于要開始著手實現這一個龐大的競賽平臺項目。我們使用Django+mysql處理后端邏輯...

    rainyang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<