【发布时间】: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