The last line was just an example -- if you don't need all the fields, then 
don't use that (or modify it accordingly). Did you try the first solution 
(i.e., properly naming and defining both the image field and the 
SQLFORM.factory table)?

Anthony

On Thursday, December 6, 2012 10:05:43 AM UTC-5, Daniele wrote:
>
> this just completely broke my website -_- ....
> Now I can't even sign a user up anymore because it's requesting all those 
> additional fields.
>
>
> On Thu, Dec 6, 2012 at 2:33 PM, Anthony <abas...@gmail.com 
> <javascript:>>wrote:
>
>> You are using SQLFORM.factory to handle the upload, but the table and 
>> field names used there do not match the table or field names where the 
>> records are actually stored, so response.download() cannot find the 
>> appropriate table or field. By default, SQLFORM.factory uses "no_table" as 
>> the dummy table name, and your code uses "image" as the field name. So, 
>> your image files will end up with names that start with "no_table.image". 
>> As a result, response.download(request, db) will look for a db.no_table 
>> table with an "image" field, but obviously won't find it. Instead, your 
>> image filenames are actually stored in db.auth_user.t_image, so you need to 
>> make sure the filenames get generated with names starting with 
>> "auth_user.t_image".
>>
>> Also, if you specify a custom uploadfolder, you'll need to make sure that 
>> the db.auth_user.t_image field has that uploadfolder specified as well, 
>> because response.download() checks the actual db field to determine the 
>> uploadfolder. The easiest approach might be to define the field once and 
>> reference both in the appended auth_user fields and in SQLFORM.factory.
>>
>> Finally, you can specify the name of the dummy table used by 
>> SQLFORM.factory by passing a "table_name" argument.
>>
>> So, maybe something like this:
>>
>> image_field = Field('t_image', 'upload', ..., uploadfolder=[your upload 
>> folder])
>> auth.settings.extra_fields['auth_user'] = [..., image_field, ...]
>> ...
>> tform = SQLFORM.factory(..., image_field, ..., table_name='auth.user')
>>
>> Actually, you should probably do that with all the fields in 
>> SQLFORM.factory -- define them all once and use them in db.auth_user and to 
>> make the form. As it is, the field definitions in db.auth_user don't even 
>> have the correct field types defined. You could first add all the fields to 
>> db.auth_user, and then do something like this:
>>
>> tform = SQLFORM.factory(*[f for f in db.auth_user if f.name.startswith(
>> 't_')], ...)
>>
>> That will include all the fields from db.auth_user that start with "t_".
>>
>> Finally, note that there will not be any errors in the form until you 
>> process it, so your condition that checks for errors will never find any. 
>> First call, form.process(), and then check for errors.
>>
>> Anthony
>>
>>
>> On Thursday, December 6, 2012 8:51:02 AM UTC-5, Daniele wrote:
>>
>>> Ok here's my code:
>>>
>>> in db.py
>>>
>>> from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
>>>
>>>
>>>
>>>
>>> auth = Auth(db)
>>> auth.settings.extra_fields['**auth_user']= [
>>>
>>>
>>>
>>>
>>>     # t denote tutor fields, s denote student fields.
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_image'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_location'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_subjects'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_qualifications'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_biography'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_hourly_rate'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_modified_on'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('s_location')]
>>>
>>>
>>>
>>>
>>>
>>> in my controller:
>>>
>>> @auth.requires_login()
>>> def edit_profile():
>>>     response <http://127.0.0.1:8000/examples/global/vars/response>.subtitle 
>>> = T <http://127.0.0.1:8000/examples/global/vars/T>("Edit Profile")
>>>
>>>
>>>
>>>
>>>     # Tutor form
>>>     tform = SQLFORM 
>>> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>.factory(
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('is_tutor', 'boolean'),
>>>
>>>
>>>
>>>
>>>         Field <http://127.0.0.1:8000/examples/global/vars/Field>('image', 
>>> 'upload', requires=IS_EMPTY_OR 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_EMPTY_OR>(IS_IMAGE 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_IMAGE>(**extensions=('jpeg', 
>>> 'jpg', 'png', 'gif')))),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('location', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('subjects', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('qualifications', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('biography', 'text'),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('hourly_rate', 
>>> 'decimal(7,2)', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('modified_on', 
>>> 'datetime', requires=IS_DATETIME 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_DATETIME>(), writable=False, 
>>> readable=False, default=request 
>>> <http://127.0.0.1:8000/examples/global/vars/request>.utcnow),
>>>
>>>
>>>
>>>
>>>         upload=URL 
>>> <http://127.0.0.1:8000/examples/global/vars/URL>('download'),
>>>
>>>
>>>
>>>
>>>         table_name='tutor')
>>>         
>>>     # Student form 
>>>
>>>
>>>
>>>
>>>     sform = SQLFORM 
>>> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>.factory(
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('is_student', 'boolean'),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('location', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         table_name='student')
>>>     
>>>     tform['_class'] = "form-horizontal"
>>>
>>>
>>>
>>>
>>>     sform['_class'] = "form-horizontal"
>>>
>>>
>>>
>>>
>>>     tform.custom.submit['_class'] = "btn btn-success"
>>>
>>>
>>>
>>>
>>>     sform.custom.submit['_class'] = "btn btn-success"
>>>
>>>
>>>
>>>
>>>     tform.custom.begin = XML 
>>> <http://127.0.0.1:8000/examples/global/vars/XML>("<%s %s>" % (tform.tag, 
>>> tform._xml()[0]))
>>>
>>>
>>>
>>>
>>>     sform.custom.begin = XML 
>>> <http://127.0.0.1:8000/examples/global/vars/XML>("<%s %s>" % (sform.tag, 
>>> sform._xml()[0]))
>>>
>>>
>>>
>>>
>>>     
>>>     if tform.errors or sform.errors:
>>>
>>>
>>>
>>>
>>>         response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('There was an error with 
>>> your submission')
>>>
>>>
>>>
>>>
>>>     else:
>>>         if tform.process().accepted:
>>>
>>>
>>>
>>>
>>>             if tform.vars.is_tutor:
>>>                 if not auth.has_membership('Tutors'):
>>>
>>>
>>>
>>>
>>>                     auth.add_membership('Tutors')
>>>                 db(db.auth_user.id == auth.user_id).update(
>>>
>>>
>>>
>>>
>>>                     t_image = tform.vars.image,
>>>                     t_location = tform.vars.location,
>>>
>>>
>>>
>>>
>>>                     t_subjects = tform.vars.subjects,
>>>                     t_qualifications = tform.vars.qualifications,
>>>
>>>
>>>
>>>
>>>                     t_biography = tform.vars.biography,
>>>                     t_hourly_rate = tform.vars.hourly_rate,
>>>
>>>
>>>
>>>
>>>                     t_modified_on = tform.vars.modified_on
>>>                 )
>>>
>>>
>>>
>>>
>>>             else:
>>>                 if auth.has_membership('Tutors'):
>>>
>>>
>>>
>>>
>>>                     auth.del_membership('Tutors')
>>>                 #db.auth_user.delete() delete the records
>>>
>>>
>>>
>>>
>>>             response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('Profile updated!')
>>>
>>>
>>>
>>>
>>>         
>>>         if sform.process().accepted:
>>>
>>>
>>>
>>>
>>>             if sform.vars.is_student:
>>>                 if not auth.has_membership('Students'**):
>>>
>>>
>>>
>>>
>>>                     auth.add_membership('Students'**)
>>>
>>>
>>>
>>>
>>>                 db(db.auth_user.id == auth.user_id).update(
>>>
>>>
>>>
>>>
>>>                     s_location = sform.vars.location
>>>                 )
>>>
>>>
>>>
>>>
>>>             else:
>>>                 if auth.has_membership('Students'**):
>>>
>>>
>>>
>>>
>>>                     auth.del_membership('Students'**)
>>>
>>>
>>>
>>>
>>>             response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('Profile updated!')
>>>
>>>
>>>
>>>
>>>     return dict(tform=tform, sform=sform)
>>>
>>>
>>>
>>>
>>> On Thu, Dec 6, 2012 at 1:48 PM, Anthony <abas...@gmail.com> wrote:
>>>
>>>> You mention using SQLFORM.factory -- do you actually store the record 
>>>> in a db table, does that db table name match the name at the beginning of 
>>>> the filename, and is the 'image' field definition in the model for that 
>>>> table the same as the field definition you're using in SQLFORM.factory? It 
>>>> might help if you show all of the relevant model and controller code.
>>>>
>>>> Anthony
>>>>
>>>>
>>>> On Thursday, December 6, 2012 8:33:10 AM UTC-5, Daniele wrote:
>>>>
>>>>> I noticed that I am missing upload=URL('download') in my 
>>>>> SQLFORM.factory, so I added that in there but it's still not working.
>>>>>
>>>>> I double checked the image name and you were right, I don't know how I 
>>>>> must have mistakenly deleted that part but it was indeed 
>>>>> "[table_name].[field_name].[**ra**nd_string]"
>>>>>
>>>>> I can't think of why else this is not working...I am following the 
>>>>> web2py book verbatim...
>>>>>
>>>>>
>>>>> On Thu, Dec 6, 2012 at 3:06 AM, Anthony <abas...@gmail.com> wrote:
>>>>>
>>>>>>
>>>>>> Hmm for some reason it's not working for me. I took a look at the 
>>>>>>> source code and this is the HTML that is being generated:
>>>>>>>
>>>>>>> <img 
>>>>>>> src="/download/image.**a6e29a6f3****6771685.**e58699e79c9f2e4a5047.**J**PG"
>>>>>>>  />
>>>>>>>
>>>>>>>
>>>>>>> And this is what I have in my view that is generating that code:
>>>>>>>
>>>>>>> {{=IMG(_src=URL('default', 'download', args=row.image))}}
>>>>>>>
>>>>>>> so it seems to be taking the 'download' directory and looking for 
>>>>>>> the image there, but as aforementioned, I've set the directory for 
>>>>>>> these 
>>>>>>> images to be in:
>>>>>>>
>>>>>>> Field('image', 'upload', uploadfolder=os.path.join(**requ****
>>>>>>> est.folder,'uploads/**profiles/'****)
>>>>>>>
>>>>>>
>>>>>> No, the URL /download/image... does not imply web2py is looking the 
>>>>>> the "download" directory. Remember, URLs do not map to directories (with 
>>>>>> the exception of static files). In web2py, URLs always map to 
>>>>>> applications, 
>>>>>> controllers, and functions. In your URL, it looks like the application 
>>>>>> and 
>>>>>> controller are excluded, so "download" will be interpreted by web2py as 
>>>>>> the 
>>>>>> function, and then the filename will be interpreted as request.args(0). 
>>>>>> This URL will call the download() function in default.py, which will 
>>>>>> ultimately call response.download(request, db), and that function will 
>>>>>> pull 
>>>>>> the filename from request.args(0).
>>>>>>
>>>>>> There is a problem with the filename, though. It starts with "image", 
>>>>>> which appears to be the field name, but it should actually start with 
>>>>>> "[table_name].[field_name]". I'm not sure how that could have happened. 
>>>>>> Do 
>>>>>> you have the same problem with new images that you upload? Do their 
>>>>>> filenames start with the table name, or just with "image"?
>>>>>>
>>>>>> Anthony
>>>>>>
>>>>>> -- 
>>>>>>  
>>>>>>  
>>>>>>  
>>>>>>
>>>>>
>>>>>  -- 
>>>>  
>>>>  
>>>>  
>>>>
>>>
>>>  -- 
>>  
>>  
>>  
>>
>
>

-- 



Reply via email to