django表单提交错误(将参数从view.py传递到表单)

时间:2014-06-19 00:11:22

标签: python django forms postgresql parameters

我是Django和Postgresql的初学者,也是stackoverflow的新手。目前我正在开发一个Web应用程序,允许用户创建一个新的postgresql数据库,以及通过网页连接到现有的数据库。

我成功实现了createdb函数,但在实现selectdb函数时遇到了一些问题。问题是当它第二次进入selectdb时(在用户选择数据库并提交结果之后),form.is_valid()总是返回false。

我想创建一个动态django表单,因为数据库的数量没有修复。所以我想将参数从view.py传递到selectdb_form.py文件表单有一个下拉字段,其中列出了用户可以选择的所有数据库名称。

这是我点击提交后返回的错误:

Exception Type: KeyError
Exception Value:    
'my_arg'
Exception Location: /Users/jetyue/Documents/atdb-web/smem02_webapp/webapp/selectdb_form.py in __init__, line 5

这是view.py中的函数(请忽略这里的错误缩进,在我的文件中它是正确的)。 我还注意到打印请求的这个有线输出.POST:

<QueryDict: {u'SelectDatabase': [u'3'], u'csrfmiddlewaretoken': [u'HxtAofaKD9FiSLLWk3vkbAdIh0mCUhdJ'], u'submit': [u'Connect to Database']}>

我不知道你在哪里?来自。

def selectdb (request):
    final_name = []

    if request.method == 'POST': #if form is submitted, comes in here
        print request.POST
        form = selectdb_form(request.POST)
        print "inside post first if"

        if form.is_valid():
            print "inside post second if"

            dataBase_name = form.cleaned_data['SelectDatabase']
            print dataBase_name + "========"

            #select a postgresql database 
            conn = psycopg2.connect("dbname='"+dataBase_name+"' user='jet' host='localhost' password='jet' port='5432' ")

            args_done = {}
            args_done.update(csrf(request))

            args_done['dataBase_name'] = dataBase_name
            return render_to_response('selectdb_done.html', args_done)


        #return render_to_response('main.html')

    else:

        conn = psycopg2.connect("dbname='postgres' user='jet' host='localhost' password='jet' port='5432' ")

        #conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
        cur = conn.cursor()
        names = []
        cur.execute('SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname;')
        names = cur.fetchall()

        #print names
        num = 0;
        while num< len(names):
            #print names[num]
            clean_name = names[num][0]
            #print clean_name
            tuple_name = (num+1, clean_name)
            final_name.append(tuple_name)
            num += 1;   

        #print final_name

        cur.close()
        conn.close()

    args = {}
    args.update(csrf(request))

    form = selectdb_form(my_arg = final_name)

    args['form'] = form
    #print args
    return render_to_response('selectdb.html', args)

这是动态表单(selectdb_form.py)文件:

from django import forms

class selectdb_form(forms.Form):
    def  __init__(self,  *args,  **kwargs):
        my_arg = kwargs.pop('my_arg') 
        super(selectdb_form, self).__init__(*args, **kwargs)
        self.fields['SelectDatabase'] = forms.ChoiceField(choices=my_arg, widget=forms.Select(), required=True)

我想知道我的动态表单是否有问题?我的意思是我可以使用动态表单form = selectdb_form(request.POST)吗?因为那是错误发生的地方。

非常感谢你们帮助我!!

2 个答案:

答案 0 :(得分:0)

错误表示my_arg中没有名为kwargs的关键字参数。

您可能想要使用my_arg

检查是否存在if 'my_arg' in kwargs:

最后,u表示您的数据位于unicode。我猜不会引起任何问题。

答案 1 :(得分:0)

您正确地将表单实例化两次,一次在GET块中,一次在POST中。但是,您只在GET块中传递my_arg参数。由于您的__init__方法需要该参数,因此会出现错误。你应该确保两次都传递参数。