我在一个表单中有两个表有问题。我使用书中的示例作为参考,但我在表单中插入图像,它确实上传文件,但URL(图像名称)是完全错误的,我不知道如何让它把正确的URL作为图像名称。
这是我的代码:
db.define_table('forum',
Field('title','string', unique=True, label=T('Title')),
Field('body','text', requires=IS_NOT_EMPTY(),label=T('Body')),
Field('posted_on','datetime',readable=False, writable=False),
Field('posted_by','reference auth_user',readable=False, writable=False),
Field('category',db.category))
db.define_table('doc',
Field('forum_id', 'reference forum',readable=False, writable=False),
Field('image','upload',uploadfolder=os.path.join(request.folder,'uploads'), autodelete=True),
Field('posted_on', 'datetime',default=request.now, readable=False, writable=False),
Field('posted_by','reference auth_user', readable=False, writable=False))
def post():
form=SQLFORM.factory(db.forum,db.doc)
db.forum.posted_on.default =request.now
db.forum.posted_by.default = auth.user
db.doc.posted_on.default = request.now
db.doc.posted_by.default= auth.user
if form.process().accepted:
id = db.forum.insert(**db.forum._filter_fields(form.vars))
form.vars.forum_id=id
id = db.doc.insert(**db.doc._filter_fields(form.vars))
session.flash='Form Posted'
redirect(URL('community'))
redirect
return dict(form=form)
答案 0 :(得分:1)
SQLFORM.factory()
创建一个带有虚拟表的虚拟DAL
实例(默认情况下名为“no_table”)。上载字段在存储文件时使用DAL
表的名称作为新文件名的一部分。文件名应以“doc。”开头,而是以“no_table”开头。解决方法是指定由SQLFORM.factory()
:
SQLFORM.factory(db.forum, db.doc, table_name='doc')
显然,如果两个表都包含上传字段,则无效,因此在这种情况下您需要更复杂的解决方法(这将涉及在调用request.vars
之前直接从form.process()
提取上传的文件} - 可以使用db.doc.image.store()
方法重命名/存储它们。