我是Django和Postgresql的初学者,也是堆栈溢出的新手。目前,我正在开发一个web应用程序,允许用户创建一个新的postgresql数据库,以及通过网页连接到现有数据库。
我成功地实现了createdb函数,但是在实现selectdb函数时遇到了一些问题。问题是,当第二次输入selectdb时(在用户选择数据库并提交结果之后),form.is_valid()总是返回false。
我想创建一个动态django表单,因为数据库的数量不是固定的。因此,我想将参数从view.py传递给selectdb_form.py文件,表单有一个下拉字段,其中列出了用户可以选择的所有数据库名称。
这是在单击submit后返回的错误:
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)吗?因为这是错误发生的地方。
非常感谢你们帮助我!!
发布于 2014-06-19 06:58:40
正确地实例化表单两次,一次在GET块中,一次在POST中。但是,您只在GET块中传递my_arg参数。因为您的__init__方法需要这个参数,所以您将得到一个错误。你应该确保两次都通过这个论点。
发布于 2014-06-19 02:32:59
此错误意味着在my_arg中没有名为kwargs的关键字参数。
您可能需要检查my_arg是否存在或不使用if 'my_arg' in kwargs:。
最后,u表示您的数据在unicode中。我想不会引起任何问题吧。
https://stackoverflow.com/questions/24296903
复制相似问题