2013-07-27 90 views
0

當我在加載我的看法:本地主機:8000 /掃描,它拋出一個問題:的Django的ModelForm提交到數據庫

TypeError on views.py in Scan, line 27: 

form = Scan() # Otherwise, set the form to unbound 

任何想法,我做錯了什麼嗎?我試圖研究,但找不到答案。 (Django新手在這裏)。謝謝你們!

Views.py

from django.http import HttpResponse 
from Scanner.forms import SubmitDomain 

def Scan(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = SubmitDomain(request.POST) # A form bound to the POST data 
    if form.is_valid(): # If form input passes initial validation... 
     form.cleaned_data['domainNm'] ## clean data in dictionary 
     try: 
      ## check if Tld Table has submitted domain already 
      from Scanner.models import Tld 
      Tld.objects.get(domainNm=form.cleaned_data['domainNm']) 

     except Tld.DoesNotExist: 
      print "Would you like to create an account?" 
      ## redirect to account creation 

     else: 
      print "Do you have an account? Please login." 
      ## redirect to account login 

    else: 
     form = Scan() # Otherwise, set the form to unbound 

Forms.py

from django.forms import ModelForm 
from Scanner.models import Tld 

class SubmitDomain(ModelForm): 

    class Meta: 
     model = Tld #Create form based off Model for Tld 
     fields = ['domainNm',] 

    def clean_domainName(self): 
     val = self.clean_domainName('domainNm') 
     return val 

## This creates the form. 
form = SubmitDomain() 

回答

1

在你的模型形式:

from django.forms import ModelForm 
from Scanner.models import Tld 

class SubmitDomainForm(ModelForm): 
    class Meta: 
     model = Tld 
     fields = ['domainNm'] 

    def clean_domainName(self): 
     val = self.cleaned_data.get('domainNm') 
     if Tld.objects.filter(domainNm=val).count() > 0: 
      raise forms.ValidationError(u'Sorry that domain already 
       exists, etc, etc') 
     return val 

在你看來,做:

from django.shortcuts import render 
from Scanner.forms import SubmitDomainForm 

def scan(request): # functions should start with a lowercase letter 
    # Bind the post data to the form, if it exists. 
    # No need for a separate if statement here 
    form = SubmitDomainForm(request.POST or None) 

    if request.method == 'POST': 
     if form.is_valid(): 
      # save your model form, or do something else 

    return render(request, 'your-template.html', {'form': form}) 

希望能幫助你。你的視圖目前正在實例化表單的錯誤類型,因此TypeError。您的模型表單上的當前乾淨方法將永遠不會驗證任何內容。它只是將值設置爲乾淨的功能。不要用表單驗證邏輯混淆視圖,而應將其放入該字段的表單的乾淨方法中,並且可以針對不同的條件引發異常。

+0

因此,try {}和{}塊應該放在表單中,而不是? – CodeTalk

+0

是的。視圖不是你想要的形式驗證邏輯:) – Brandon

+0

哈哈,好吧,正如我所說我仍然真的需要這整個MTV的東西,但我肯定了解了很多。那麼,這是否被認爲是服務器端驗證,因爲它是從模型的驗證驗證的?作爲最佳實踐是否需要額外的驗證? – CodeTalk

-1

的問題是不特定於Django的,這是基本的蟒蛇。你的縮進是錯誤的。代碼大概應該是這樣的:

if request.method == 'POST': 
    form = SubmitDomain(request.POST) 
    if form.is_valid(): # indent fixed here 
     form.cleaned_data['domainNm'] 
+0

聖莫里,哇。我必須習慣這種縮進的東西:)。非常感謝! – CodeTalk

+0

問題是,我做了這個,但後來又得到了另一個類型錯誤。請參閱最新的問題 – CodeTalk

+0

此外,讀取form.cleaned_data ['domainNm']的代碼行並不會執行您的想法。具體來說,它不會清除表單的'domainNm'數據。它只是訪問清理後的值(假設已經在窗體上調用了clean()),然後拋出該值。 – jarmod

0

失敗時reuqest.method = 「POST」,在這種情況下的形式沒有被定義

相關問題