0

localhost:8000/Scan でビューをロードすると、次の問題がスローされます。

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()
4

3 に答える 3

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. モデル フォームの現在の clean メソッドは、何も検証しません。clean 関数と等しい値を設定するだけです。フォーム検証ロジックでビューを乱雑にする代わりに、それをそのフィールドのフォームのクリーン メソッドに配置すると、さまざまな条件で例外を発生させることができます。

于 2013-07-27T01:52:53.680 に答える
0

reuqest.method != "POST" の場合に失敗します。この場合、フォームは定義されていません。

于 2013-07-27T01:49:43.860 に答える
-1

問題は django に固有のものではなく、基本的な python です。あなたのインデントは間違っています。コードはおそらく次のようになります。

if request.method == 'POST':
    form = SubmitDomain(request.POST)
    if form.is_valid(): # indent fixed here
        form.cleaned_data['domainNm'] 
于 2013-07-27T01:48:47.783 に答える