Django創(chuàng)建通用視圖函數(shù)

想在我們有兩個視圖:

def thinkingview(request):
    user = request.user
    if request.method == 'GET':
        return render(request, 'think.html', {'user': user})
    elif request.method == 'POST:
        user = request.user
        data_form = ThinkingForm(request.POST)
        if data_form.is_valid():
            data_form.save()
            return redirect('index')
        else:
            return render(request, 'think.html', {'user': user, 'error': data_form.errors})
def questionview(request):
    user = request.user
    if request.method == 'GET':
        user = request.user
        return render(request, 'question.html', {'user': user})
    elif request.method == 'POST:
        data_form = QuestionForm(request.POST)
        if data_form.is_valid():
            data_form.save()
            return redirect('index')
        else:
            return render(request, 'question.html', {'user': user, 'error': data_form.errors})

這兩個視圖非常相似凿滤,GET渲染頁面并預(yù)置用戶信息米愿,POST提交文本數(shù)據(jù)威始,不同的只有tamplate和form這兩個對象≈鲁叮現(xiàn)在把這兩個對象抽象出來肤寝,創(chuàng)建一個通用的視圖:

# view.py
def reportview(request, tamplate_name, form):
    user = request.user
    if request.method == 'GET':
        user = request.user
        return render(request, tamplate_name, {'user': user})
    elif request.method == 'POST:
        data_form = form(request.POST)
        if data_form.is_valid():
            data_form.save()
            return redirect('index')
        else:
            return render(request, tamplate_name, {'user': user, 'error': data_form.errors})

通過URLconf的傳遞額外參數(shù)的方式來傳遞這兩個對象:

# urls.py
from django.conf.urls import url
from myapp import forms, views

urlpatterns = [
    url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm}),
    url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm})

這樣就有了一個可復(fù)用的、與對象無關(guān)的視圖(在URLconf中甚至可以傳遞model)抖僵!如果再有類似功能的視圖時就可以重用這個report視圖鲤看,而不需要再寫視圖代碼。

現(xiàn)在來做一些優(yōu)化耍群,在同一個視圖函數(shù)中對POSTGET 進(jìn)行處理是一種比較粗糙的做法义桂,一個比較好的設(shè)計(jì)習(xí)慣應(yīng)該是,用兩個分開的視圖函數(shù)——一個處理POST請求世吨,另一個處理GET請求澡刹,然后在相應(yīng)的地方分別進(jìn)行調(diào)用。
寫一個分發(fā)函數(shù)耘婚,由它來分派GET和POST請求:

#views.py
from django.views.decorators.http import require_http_methods
...


def method_splitter(request, *args, **kwargs):
    #對http method進(jìn)行分發(fā)
    get_view = kwargs.pop('get', None)
    post_view = kwargs.pop('post', None)
    if request.method == 'GET' and get_view is not None:
        return get_view(request, *args, **kwargs)
    elif request.method == 'POST' and post_view is not None:
        return post_view(request, *args, **kwargs)
    raise Http404

@require_http_methods('GET')
def report_get(request, tamplate_name):
    user = request.user
    return render(request, tamplate_name, {'user': user})

@require_http_methods('POST')
def report_post(request, tamplate_name, form):
    data_form = form(request.POST)
    if data_form.is_valid():
        data_form.save()
        return redirect('index')
    else:
        return render(request, tamplate_name,  'user': request.user, 'error': data_form.errors})


#urls.py
urlpatterns = [
    url(r'^thinking/$', views.report, {'tamplate_name': 'thinking.html', 'form': forms.ThinkingForm, 'get': view.report_get, 'post': view.report_post}),
    url(r'^question/$', view.report, {'tamplata_name': 'question.html', 'form': forms.QuestionForm, 'get': view.report_get, 'post': view.report_post})

現(xiàn)在我們就擁有了一個不錯的,可以通用的視圖函數(shù)了陆赋,里邊封裝著由request.method 的返回值來分派不同的視圖的程序.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沐祷,一起剝皮案震驚了整個濱河市嚷闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赖临,老刑警劉巖胞锰,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兢榨,居然都是意外死亡嗅榕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門吵聪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌那,“玉大人,你說我怎么就攤上這事吟逝∶钡” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵块攒,是天一觀的道長励稳。 經(jīng)常有香客問我,道長囱井,這世上最難降的妖魔是什么驹尼? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮庞呕,結(jié)果婚禮上新翎,老公的妹妹穿的比我還像新娘。我一直安慰自己千扶,他們只是感情好料祠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澎羞,像睡著了一般髓绽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妆绞,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天顺呕,我揣著相機(jī)與錄音,去河邊找鬼括饶。 笑死株茶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的图焰。 我是一名探鬼主播启盛,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僵闯?” 一聲冷哼從身側(cè)響起卧抗,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳖粟,沒想到半個月后社裆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡向图,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年泳秀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榄攀。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗜傅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出航攒,到底是詐尸還是另有隱情磺陡,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布漠畜,位于F島的核電站币他,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏憔狞。R本人自食惡果不足惜蝴悉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘾敢。 院中可真熱鬧拍冠,春花似錦、人聲如沸簇抵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碟摆。三九已至晃财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間典蜕,已是汗流浹背断盛。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愉舔,地道東北人钢猛。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像轩缤,于是被迫代替她去往敵國和親命迈。 傳聞我的和親對象是個殘疾皇子贩绕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 基于類的視圖 Django中的視圖是一個可調(diào)用對象,它接收一個請求然后返回一個響應(yīng)躺翻。這個可調(diào)用對象不僅僅限于函數(shù)丧叽,...
    蘭山小亭閱讀 4,562評論 1 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理卫玖,服務(wù)發(fā)現(xiàn)公你,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法假瞬,類相關(guān)的語法陕靠,內(nèi)部類的語法,繼承相關(guān)的語法脱茉,異常的語法剪芥,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Django基于類的視圖 1.基于類的視圖簡介 基于類的視圖使用Python 對象實(shí)現(xiàn)視圖,它提供除函數(shù)視圖之外的...
    常大鵬閱讀 8,627評論 0 25
  • Refer to: www.threemeal.com/blog/12/ 中間件 中間件是一個鉤子框架琴许,它們可以介...
    蘭山小亭閱讀 16,468評論 9 165