【问题标题】:django form submission error (passing parameter from view.py to form)django 表单提交错误(将参数从 view.py 传递到表单)
【发布时间】:2014-08-09 10:03:33
【问题描述】:

我是 Django 和 Postgresql 的初学者,也是 stackoverflow 的新手。目前我正在开发一个网络应用程序,允许用户创建一个新的 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 中的函数(请忽略这里的错误缩进,在我的文件中是正确的)。 我还注意到 print request.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) 与动态表单一起使用吗?因为那是发生错误的地方。

非常感谢你们帮助我!!

【问题讨论】:

    标签: python django forms postgresql parameters


    【解决方案1】:

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

    【讨论】:

    • 感谢@Daniel Roseman 的回复!我之前在 POST 部分尝试过这种类似的方法:form = selectdb_form(request.POST, myarg = final_name),但它对我不起作用。 (它不断将 /webapp/selectdb 部分添加到 url,如下所示:localhost:8000/webapp/selectdb/webapp/selectdb/webapp/selectdb)我想要的只是获取在 POST 部分的 forms.ChoiceField 中提交的数据。我想知道有什么简单的解决方案吗?非常感谢!
    • 谢谢!我解决了这个问题:当我第二次进入 seledtdb(post 部分)时,final_name 是空的,所以没有任何东西传递到 my_arg,我最终连接到 postgresql db 并再次获取名称并将其设置在 final_name 中。
    【解决方案2】:

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

    您可能想使用if 'my_arg' in kwargs: 检查my_arg 是否存在

    最后u 表示您的数据在unicode 中。我猜不会造成任何问题。

    【讨论】:

    • 感谢您的回复!!
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 2021-02-01
    • 2013-12-26
    • 1970-01-01
    • 2012-03-13
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多