我是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)
吗?因为那是错误发生的地方。
非常感谢你们帮助我!!
答案 0 :(得分:0)
错误表示my_arg
中没有名为kwargs
的关键字参数。
您可能想要使用my_arg
if 'my_arg' in kwargs:
最后,u
表示您的数据位于unicode
。我猜不会引起任何问题。
答案 1 :(得分:0)
您正确地将表单实例化两次,一次在GET块中,一次在POST中。但是,您只在GET块中传递my_arg
参数。由于您的__init__
方法需要该参数,因此会出现错误。你应该确保两次都传递参数。