On Jul 17, 9:41 pm, Tyler Laing <[email protected]> wrote: > I've been struggling with forms all day. > > Here are the issues I've run into: > 1) There is no way to manually insert the hidden form values with > FORM. This should be an option, so people can customize the layout of > their forms better.
form=FORM(....,hidden=dict(key=value,otherkey=othervalue) same with SQLFORM > 2) We need an ability to say what fields to NOT use in the table we > reference in SQLFORM. This, again, would make it easier to make a form > for JUST what we need. It means then that if we customize the forms as > per custom forms page here:http://web2py.com/book/default/section/7/7 > that these forms will not ever validate. Not sure I understand. Are you talking about adding fields to a SQLFORM. You can in two ways form=SQLFORM(db.table) form.element('table').insert(TR('label',INPUT(_name='name'),'comment')) or form=SQLFORM.factory(db.table,Field('name')) # new fields appended at the end > I'm writing a basic forum, and this is some of the code I've done. > > db.define_table("sections", Field("name", 'string'), Field("desc", > 'string'), Field("ordering", 'integer')) > db.define_table("forums", Field("name", 'string'), Field("desc", > 'string'), Field("ordering", 'integer'), Field("section_id", > 'reference sections')) > db.define_table("threads", Field("name", 'string', > requires=IS_NOT_EMPTY(), required=True), Field("author", > db.auth_user, default=user_id), Field("datetime", 'datetime'), > Field("forum_id", 'reference forums')) > db.define_table("posts", Field("subject", 'string'), Field("body", > 'string', length = 10000, requires=IS_NOT_EMPTY()), Field("author", > db.auth_user, default=user_id), Field("datetime", 'datetime'), > Field('postcount', 'integer'), Field('thread_id', 'reference > threads')) > > Notice the various fields in posts? > > The generated HTML for an SQLFORM of db.posts: > <form action="" enctype="multipart/form-data" method="post"><table><tr > id="posts_subject__row"><td class="w2p_fl"><label for="posts_subject" > id="posts_subject__label">Subject: </label></td><td > class="w2p_fw"><input class="string" id="posts_subject" name="subject" > type="text" value="" /></td><td class="w2p_fc"></td></tr><tr > id="posts_body__row"><td class="w2p_fl"><label for="posts_body" > id="posts_body__label">Body: </label></td><td class="w2p_fw"><textarea > class="string" cols="100" id="posts_body" name="body" rows="20" > type="text" value=""></textarea></td><td class="w2p_fc"></td></tr><tr > id="posts_author__row"><td class="w2p_fl"><label for="posts_author" > id="posts_author__label">Author: </label></td><td > class="w2p_fw"><select class="reference auth_user" id="posts_author" > name="author"><option value=""></option><option selected="selected" > value="1">Tyler Laing (1)</option><option value="2">Tyler Laing (2)</ > option></select></td><td class="w2p_fc"></td></tr><tr > id="posts_datetime__row"><td class="w2p_fl"><label > for="posts_datetime" id="posts_datetime__label">Datetime: </label></ > td><td class="w2p_fw"><input class="datetime" id="posts_datetime" > name="datetime" type="text" value="" /></td><td class="w2p_fc"></td></ > tr><tr id="posts_postcount__row"><td class="w2p_fl"><label > for="posts_postcount" id="posts_postcount__label">Postcount: </label></ > td><td class="w2p_fw"><input class="integer" id="posts_postcount" > name="postcount" type="text" value="" /></td><td class="w2p_fc"></td></ > tr><tr id="posts_thread_id__row"><td class="w2p_fl"><label > for="posts_thread_id" id="posts_thread_id__label">Thread Id: </label></ > td><td class="w2p_fw"><input class="reference threads" > id="posts_thread_id" name="thread_id" type="text" value="" /></td><td > class="w2p_fc"></td></tr><tr id="submit_record__row"><td > class="w2p_fl"></td><td class="w2p_fw"><input type="submit" > value="Submit" /></td><td class="w2p_fc"></td></tr></table><div > class="hidden"><input name="_formkey" type="hidden" value="bafdb421- > c041-4172-9e54-f98cfbe8adb4" /><input name="_formname" type="hidden" > value="posts_create" /></div></form> > > This is for a forum! I don't want to show thread_id, postcount, > datetime, or the author field. I've tried what people have suggested > of doing: > > db.posts.author.writeable = False > db.posts.datetime.writeable = False > db.posts.postcount.writeable = False > db.posts.thread_id.writeable = False should be "writable" not "writeable" db.posts.author.writable = db.posts.author.readable = False db.posts.datetime.writable = db.posts.datetime.readable = False db.posts.postcount.writable = db.posts.postcount.readable = False db.posts.thread_id.writable = db.posts.thread_id.readable = False BTW, you should NOT have a field called 'datetime' because it is a reserved keyword and you can run into problems. > The fields still show up. So as per the custom forms, I'm trying this: > > <table> > {{=form.custom.begin}} > {{form.custom.widget.body.tag='textarea'}} > {{form.custom.widget.body._postprocessing = TEXTAREA._postprocessing}} > {{form.custom.widget.body.attributes["_rows"] = 20}} > {{form.custom.widget.body.attributes["_cols"] = 100}} > {{=TR(TD("Subject:"), TD(form.custom.widget.subject))}} > {{=TR(TD(form.custom.widget.body, _colspan=2))}} > {{=TR(TD(form.custom.submit))}} > {{=form.custom.end}} > </table> The {{form.custom.widget.body...}} should be <tr><td>{{=form.custom.widget.body...}}....</td></tr> > While this changes the text input to a textarea, as I wanted, because > I lack the four fields above, it does not ever validate. I've looked, > and looked, and looked, through many posts, and many threads. > > The forms part of web2py needs to be A) better documented B) actually > be useable for a real world use case(forums). True. Anyway, hope this was helpful. Massimo

