Yep, forms the base for what I needed.
made a small patch to extend it a bit, the patch includes some doc
updates as well.
This allows for:
{{extend 'layout.html'}}
Registration form
{{lbl=form.custom.label}}
{{wid=form.custom.widget}}
{{=form.custom.form.start}}
<table>
<tbody>
{{for f in form.fields:}}
{{if step==1:}}<tr>{{pass}}
<td>{{=f}}</td>
<td>{{=lbl[f]}}</td>
<td>{{=wid[f]}}</td>
{{step=step+1}}
{{if step==2:}}</tr>{{step=1}}{{pass}}
{{pass}}
</tr>
</tbody>
</table>
{{=form.custom.submit}}
{{=form.hidden_fields()}}
{{=form.custom.form.close}}
I've not yet managed to get {{=form.hidden_fields()}} in to
{{=form.custom.form.close}}
=== modified file 'web2py/gluon/sqlhtml.py'
--- web2py/gluon/sqlhtml.py 2009-05-31 18:42:23 +0000
+++ web2py/gluon/sqlhtml.py 2009-06-04 16:56:52 +0000
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""
-This file is part of web2py Web Framework (Copyrighted, 2007)
+This file is part of web2py Web Framework (Copyrighted, 2007-2009)
Developed by Massimo Di Pierro <[email protected]>
License: GPL v2
"""
@@ -289,13 +289,22 @@
nbsp = XML(' ') # Firefox2 does not display fields with blanks
FORM.__init__(self, *[], **attributes)
ofields = fields
+
+ # if no fields are provided, build it from the provided table
+ # will only use writable or readable fields, unless forced to ignore
if fields == None:
fields = [f for f in table.fields if \
ignore_rw or table[f].writable or table[f].readable]
self.fields = fields
+
+ # make sure we have an id
if not 'id' in self.fields:
self.fields.insert(0, 'id')
+
self.table = table
+
+ # try to retrieve the indicated record using its id
+ # otherwise ignore it
if record and isinstance(record, (int, long, str, unicode)):
records = table._db(table.id == record).select()
if records:
@@ -303,6 +312,7 @@
else:
record = None
self.record = record
+
self.record_id = None
self.trows = {}
xfields = []
@@ -311,43 +321,57 @@
self.custom.dspval = Storage()
self.custom.inpval = Storage()
self.custom.label = Storage()
+ self.custom.comment = Storage()
+ self.custom.widget = Storage()
+ self.custom.linkto = Storage()
+
for fieldname in self.fields:
if fieldname.find('.') >= 0:
continue
field = self.table[fieldname]
+
if comments:
comment = col3.get(fieldname, field.comment) or ''
else:
comment = ''
+ self.custom.comment[fieldname] = comment
+
if labels != None and fieldname in labels:
label = labels[fieldname]
else:
label = str(field.label) + ': '
self.custom.label[fieldname] = label
+
field_id = '%s_%s' % (table._tablename, fieldname)
label = LABEL(label, _for=field_id, _id='%s__label' % field_id)
row_id = field_id + '__row'
if fieldname == 'id':
self.custom.dspval.id = nbsp
self.custom.inpval.id = ''
+ widget = ''
if record:
if showid and 'id' in fields and field.readable:
v = record['id']
+ widget = SPAN(v, _id=field_id)
self.custom.dspval.id = str(v)
- xfields.append(TR(label, SPAN(v, _id=field_id),
+ xfields.append(TR(label, widget,
comment, _id='id__row'))
self.record_id = str(record['id'])
+ self.custom.widget.id = widget
continue
+
if record:
default = record[fieldname]
else:
default = field.default
+
cond = readonly or \
(not ignore_rw and not field.writable and field.readable)
if default and not cond:
default = field.formatter(default)
dspval = default
inpval = default
+
if cond:
# ## if field.represent is available else
@@ -391,11 +415,16 @@
continue
else:
inp = self.widgets.string.widget(field, default)
+
tr = self.trows[fieldname] = TR(label, inp, comment,
_id=row_id)
xfields.append(tr)
self.custom.dspval[fieldname] = dspval or nbsp
self.custom.inpval[fieldname] = inpval or ''
+ self.custom.widget[fieldname] = inp
+
+ # if a record is provided and found, as is linkto
+ # build a link
if record and linkto:
for (rtable, rfield) in table._referenced_by:
query = urllib.quote(str(table._db[rtable][rfield]
@@ -405,28 +434,47 @@
continue
if labels and lname in labels:
lname = labels[lname]
- xfields.append(TR('', A(lname, _class='reference',
+ widget = A(lname, _class='reference',
_href='%s/%s?query=%s' % (linkto,
- rtable, query)), col3.get(olname, ''
+ rtable, query))
+ xfields.append(TR('', widget, col3.get(olname, ''
), _id='%s__row' % olname.replace('.'
, '__')))
+ self.custom.linkto[olname.replace('.', '__')] = widget
+
+ # when deletable, add delete? checkbox
+ self.custom.deletable = ''
if record and deletable:
+ widget = INPUT(_type='checkbox', _class='delete',
+ _id='delete_record',
+ _name='delete_this_record')
xfields.append(TR(LABEL(delete_label, _for='delete_record',
- _id='delete_record__label'),
- INPUT(_type='checkbox', _class='delete',
- _id='delete_record',
- _name='delete_this_record'),
+ _id='delete_record__label'), widget,
col3.get('delete_record', ''),
_id='delete_record__row'))
+ self.custom.deletable = widget
+ # when writable, add submit button
+ self.custom.submit = ''
if not readonly:
- xfields.append(TR('', INPUT(_type='submit',
- _value=submit_button),
+ widget = INPUT(_type='submit',
+ _value=submit_button)
+ xfields.append(TR('', widget,
col3.get('submit_button', ''),
_id='submit_record__row'))
+ self.custom.submit = widget
+ # if a record is provided and found
+ # make sure it's id is stored in the form
if record:
if not self['hidden']:
self['hidden'] = {}
self['hidden']['id'] = record['id']
+
+ form = Storage()
+ (form.start, form.close) = self._xml()
+ form.start = XML("<%s %s>" % (self.tag, form.start))
+ form.close = XML("%s</%s>" % (form.close, self.tag))
+ self.custom.form = form
+
self.components = [TABLE(*xfields)]
def accepts(
@@ -579,7 +627,6 @@
self.vars.id = self.table.insert(**fields)
return ret
-
class SQLTABLE(TABLE):
"""
@@ -673,7 +720,10 @@
def form_factory(*fields, **attributes):
+ """
+ generates a SQLFORM for the given fields.
+
+ Internally will build a non-database based data model to hold the fileds.
+ """
return SQLFORM(SQLDB(None).define_table('no_table', *fields),
**attributes)
-
-
2009/6/4 Hans Donner <[email protected]>:
> Seems to be it, thanks.
>
> 2009/6/4 David Marko <[email protected]>:
>>
>> Do you mean something like this? http://web2py.com/AlterEgo/default/show/205
>>
>> David
>>
>> On 4 čvn, 11:12, Hans Donner <[email protected]> wrote:
>>> Currently SQLFORM renders a complete table for the fields provided (or
>>> all) for a db.table, and does some other magic as well.
>>>
>>> Would love to reuse the magic, but be in more control of the
>>> rendering. Eg, would like to specify what fields are placed where, and
>>> if they should include labels or not etc.
>>> What fields are to be rendered where should be easiliy done form the
>>> template.
>>>
>>> (the underlying table is quite big, and when all is listed like it is
>>> now it's too overwhelming. A different layout makes it far more better
>>> (esp when throwing in some ajax), eg having some sort of matrix,
>>> having some labels only for rows and columns vs for every field)
>>>
>>> Any suggestions?
>>> I'm digging in the code, and find that the fields and the rendering of
>>> the fields are glued together and not easy to seperate/re-use. Might
>>> be that I'm missing something here.
>>>
>>> Would like to do something like:
>>>
>>> {{=form.start}}
>>> <table>
>>> <th><td></td><td>header 1</td><td>header 2</td><td>header 3</td></tr>
>>> <tr><td>{{=form.field['field1'].label</td><td>{{=form.field['field1']</td><
>>> td>{{=form.field['field2']</td><td>{{=form.field['field5']</td></tr>
>>> </table>
>>> <div>
>>> <span>{{=form.field['field3'].label}}: {{=form.field['field3']}}</span>
>>> </div>
>>> <div>
>>> {{=form.submit}}
>>> </div>
>>> {{=form.end}}
>>>
>>> where the fields have the currently shown widgets in place without the
>>> need for me to construct these...
>> >>
>>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---