首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django表单提交错误(将参数从view.py传递到窗体)

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

Stack Overflow用户
提问于 2014-06-19 00:11:22
回答 2查看 389关注 0票数 0

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

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

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

这是在单击submit后返回的错误:

代码语言:javascript
复制
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内部的函数(请忽略这里的错误缩进,它在我的文件中是正确的)。我还注意到了来自print request.POST的有线输出:

代码语言:javascript
复制
<QueryDict: {u'SelectDatabase': [u'3'], u'csrfmiddlewaretoken': [u'HxtAofaKD9FiSLLWk3vkbAdIh0mCUhdJ'], u'submit': [u'Connect to Database']}>

我不知道你从哪里来。

代码语言:javascript
复制
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)文件:

代码语言:javascript
复制
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)吗?因为这是错误发生的地方。

非常感谢你们帮助我!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 06:58:40

正确地实例化表单两次,一次在GET块中,一次在POST中。但是,您只在GET块中传递my_arg参数。因为您的__init__方法需要这个参数,所以您将得到一个错误。你应该确保两次都通过这个论点。

票数 1
EN

Stack Overflow用户

发布于 2014-06-19 02:32:59

此错误意味着在my_arg中没有名为kwargs的关键字参数。

您可能需要检查my_arg是否存在或不使用if 'my_arg' in kwargs:

最后,u表示您的数据在unicode中。我想不会引起任何问题吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24296903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档