2013-07-27 88 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”,在这种情况下的形式没有被定义

相关问题