2013-07-28 40 views
0

我開始學習Django,並開始觀看關於如何創建表單的教程,並且我已經看到很多地方的表單是這樣創建的。django request.POST到底做了什麼以及如何使用它?

def create(request): 
    if request.POST: 
     form = ArticleForm(request.POST) 
     if form.is_valid: 
      form.save() 
    else: 
     form = ArticleForm() 
    args = {} 
    args.update(csrf(request)) 
    args['form'] = form 
    return render_to_response('create_article.html', args) 

現在,假設我創建了一個模式叫文章,然後創建從該模型的ArticleForm,究竟是怎麼回事(在我上面提供的代碼)?我明白,如果form.is_valid:form.save()部分,並根據我所讀到的,請求應始終是第一個參數,但有人可以解釋什麼請求作爲參數,以及該函數的前兩行是什麼在做什麼?在else語句和else語句(args部分)之後究竟發生了什麼?

編輯:另外,假設文章模型有一個名爲name = models.CharField(max_length = 20)的字段,有沒有辦法讓我獲取/訪問用戶爲表單的特定部分輸入的內容?假設我想獲取名稱並查看名稱是否已經存在於我的數據庫中,那麼有沒有辦法讓我這麼做?

回答

1

代碼中存在一些錯誤,它似乎是從SO問題複製粘貼的。我會建議通過the excellent Django documentation,特別是Django tutorial

你的例子應該看起來像this example from the Django docs

這裏有一些評論:

def create(request): 
    if request.POST: 
     form = ArticleForm(request.POST) 
     if form.is_valid: 
      form.save() 
      # after successful POST 
      # we want to redirect to a different page here 
    else: 
     form = ArticleForm() 
    args = {} 
    # you really don't need the following necessarily 
    # just use `{% csrf_token %}` inside the form in your template 
    args.update(csrf(request)) 
    args['form'] = form 
    # using just `render` like in the example linked to above is more modern 
    return render_to_response('create_article.html', args) 
+0

好的完美,謝謝!所以假設Article模型有一個名爲name = models.CharField(max_length = 20)的字段,有沒有辦法讓我獲得/訪問用戶爲表單的特定部分輸入的內容?假設我想知道名稱,並查看名稱是否已經存在於我的數據庫中,那麼我該怎麼做呢? – user216485

+1

當然可以。不要混淆Django Forms和Models,他們有不同的意圖(Forms = User Input Validation,Models = data persistence and access)。嘗試Django教程或文檔的模型/表單部分。 – stefanw

3

request.POST等(如CSRF標記值)包含用戶在表單中輸入的所有數據。

if request.POST 

檢查用戶是否實際驗證了表單,否則請求中沒有POST數據。

form = ArticleForm(request.POST) 

看起來很奇怪在第一,但在用戶驗證表單,在同一頁面加載,但POST數據在Django的形式進行數據驗證處理(如檢查是否必填欄留空,等... )以便在表單中顯示錯誤。 如果沒有錯誤(form.is_valid()),則視圖程序繼續。

+0

嗯好吧,假設第模型有個名字叫= models.CharField(MAX_LENGTH = 20)場,有沒有讓我得到的方式/訪問什麼用戶是否爲該表單的特定部分輸入?假設我想獲取名稱並查看名稱是否已經存在於我的數據庫中,那麼有沒有辦法讓我這麼做? – user216485

+1

絕對是的,你可以通過代替「form.save()」來獲得每個字段的數據(通過btw形式清理)並單獨處理它們,而不必將它們保存到數據庫中。我不是用我的django開發計算機,我忘記了它的確切語法... –

+0

它可能是«particularFieldName = form.cleaned_data ['specialFieldName']»例如。 –

1

我希望你熟悉HTTP methods就像GET和POST。

request對象表示任何用戶代理的單個請求。因此,當您從搜索引擎中瀏覽特定頁面或從搜索器中瀏覽您的請求時,它可能是您的瀏覽器發送的請求。閱讀更多關於請求的信息here

request.POST是此request對象的一個​​屬性,它是一個QueryDict(與正常的Python字典非常相似)。它包含發送到您的視圖的HTTP POST參數。

總之在你的榜樣:

def create(request): 
    if request.POST: # check if the request is POST request and it contains any parameter 
     form = ArticleForm(request.POST) # then pass all those parameters to the form 
     if form.is_valid: # process the form to check if it's valid 
      form.save() # save the data if it's valid 
     else: 
      form = ArticleForm() # if not valid data, initialize an new/empty form 
    args = {} # create a dict to pass to the template 
    args.update(csrf(request)) # add the CSRF token 
    args['form'] = form # add the 'form' above to the 'args' dict 
    return render_to_response('create_article.html', args) # pass that dict to template 

不是很確定爲什麼你有這樣的例子,通常我會做最後的部分是這樣的:

def create(request): 
    .... your code .... 
    else: 
     form = ArticleForm() 
    return render(request, 'create_article.html', { form: form }) 

希望它能幫助。

+0

檢查我編輯的答案 –

+0

是的好吧完美,我只是意識到你做了什麼更好..好吧,所以最後一個問題是,假設文章模型有一個名爲name = models.CharField(max_length = 20)的字段,有沒有辦法讓我獲得/訪問用戶爲表單的特定部分輸入的內容?假設我想知道名稱,並查看名稱是否已經存在於我的數據庫中,那麼我該怎麼做呢? – user216485

+1

是的,你可以通過使用request.POST.get('name','')'或者在你的表單中檢查它,使用表單更清晰。 –

相關問題