As a workaround to this bug, you could get the group separately, and attach
all of the group fields to the staff form manually until a fix is
implemented. Something like (hasn't been tested, you may need to assign
each NICSGroupType field to a form field):

staff = Staff.objects.using('gold').get(username=current_staff)
form = StaffForm(instance = staff)
group =
NICSGroupType.objects.using('gold').get(n_group_number=staff.nics_group.n_group_number)

form.nics_group = group # this may attach all fields, but most likely
you'll have to attach them manually, since they would just be a goup, not
FormFields.

Hopefully that will get you through this jam, until a fix is created. I
haven't written any patches before, but I will see if I can figure it out,
time permitting.

Thanks,

Furbee


On Fri, Nov 4, 2011 at 3:36 PM, Furbee <furbeena...@gmail.com> wrote:

> No worries. Wow, I've got some interesting results. I am pretty sure the
> ModelForm class has a bug in it that it is not looking at the secondary
> database with the using() method. It is a bug in the foreign reference
> fields only, though.
>
> I set up tables in my default database, and in an extra database named
> staff, which is set up in settings.py.
>
> In default DB:
> n_test_staff
> username;nics_group
> "tsamuel";1
>
> n_nics_groups
> n_group_number;n_group_name
> 1;"Group1"
> 2;"Group2"
>
> In staff DB:
> n_test_staff
> username;nics_group
> "tsamuel";2 (Notice tsamuel in group 2 in this DB)
>
> n_nics_groups
> n_group_number;n_group_name
> 1;"Staff1"
> 2;"Staff2"
>
> In the models, wrote __unicode__(self): method to show the groups.
>
>
> Here's something strange:
> >>> from models import Staff, NICSGroupType
> >>> from django.forms import ModelForm
> >>> class StaffForm(ModelForm):
> ...     class Meta:
> ...         model = Staff
> ...
> >>> staff = Staff.objects.using('staff').get(username='tsamuel')
> >>> print staff
> tsamuel <group: Staff2 >
> >>> form = StaffForm(instance=staff)
> >>> print form
> <tr><th><label for="id_username">Username:</label></th><td><input
> id="id_username" type="text" name="username" value="tsamuel" maxlength="50"
> /></td></tr>
> <tr><th><label for="id_nics_group">Nics group:</label></th><td><select
> name="nics_group" id="id_nics_group">
> <option value="">---------</option>
> <option value="2" selected="selected">2: Group2</option>
> <option value="1">1: Group1</option>
> </select></td></tr>
>
> Notice this ModelForm is getting the Staff data from the 'staff' database,
> but is getting the reference n_nics_groups data from the default database's
> n_nics_groups table. Remember in staff tsamuel was part of group 2, which
> is the selected option, but the label is Group2 instead of Staff2, which is
> the value in n_nics_groups table in the 'staff' database.
>
>
> Then I tried deleting the default database n_test_staff table to verify:
> >>> from models import Staff, NICSGroupType
> >>> from django.forms import *
> >>> class StaffForm(ModelForm):
> ...     class Meta:
> ...         model = Staff
> ...
> >>> staff = Staff.objects.using('staff').get(username='tsamuel')
> >>> form = StaffForm(instance=staff)
> >>> print form
> <tr><th><label for="id_username">Username:</label></th><td><input
> id="id_username" type="text" name="username" value="tsamuel" maxlength="50"
> /></td></tr>
> <tr><th><label for="id_nics_group">Nics group:</label></th><td><select
> name="nics_group" id="id_nics_group">
> <option value="">---------</option>
> <option value="2" selected="selected">2: Group2</option>
> <option value="1">1: Group1</option>
> </select></td></tr>
>
>
>
> Now, if I delete the default database's n_nics_groups table also, so it
> should all be using the 'staff' database, the only place n_test_staff and
> n_nics_groups exist now.
> >>> from models import Staff, NICSGroupType
> >>> from django.forms import *
> >>> class StaffForm(ModelForm):
> ...     class Meta:
> ...         model = Staff
> ...
> >>> staff = Staff.objects.using('staff').get(username='tsamuel')
> >>> print staff
> tsamuel <group: Staff2 >
> >>> form = StaffForm(instance=staff)
> >>> print form
> Traceback (most recent call last):
>   File "<console>", line 1, in <module>
>   File "/usr/lib/python2.5/site-packages/django/utils/encoding.py", line
> 27, in __str__
>     return self.__unicode__().encode('utf-8')
>   File "/usr/lib/python2.5/site-packages/django/forms/forms.py", line 95,
> in __unicode__
>     return self.as_table()
>   File "/usr/lib/python2.5/site-packages/django/forms/forms.py", line 217,
> in as_table
>     errors_on_separate_row = False)
>   File "/usr/lib/python2.5/site-packages/django/forms/forms.py", line 180,
> in _html_output
>     'field': unicode(bf),
>   File "/usr/lib/python2.5/site-packages/django/forms/forms.py", line 408,
> in __unicode__
>     return self.as_widget()
>   File "/usr/lib/python2.5/site-packages/django/forms/forms.py", line 439,
> in as_widget
>     return widget.render(name, self.value(), attrs=attrs)
>   File "/usr/lib/python2.5/site-packages/django/forms/widgets.py", line
> 516, in render
>      options = self.render_options(choices, [value])
>   File "/usr/lib/python2.5/site-packages/django/forms/widgets.py", line
> 533, in render_options
>     for option_value, option_label in chain(self.choices, choices):
>   File "/usr/lib/python2.5/site-packages/django/forms/models.py", line
> 882, in __iter__
>     for obj in self.queryset.all():
>   File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line
> 107, in _result_iter
>     self._fill_cache()
>   File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line
> 772, in _fill_cache
>     self._result_cache.append(self._iter.next())
>   File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line
> 273, in iterator
>     for row in compiler.results_iter():
>   File
> "/usr/lib/python2.5/site-packages/django/db/models/sql/compiler.py", line
> 680, in results_iter
>     for rows in self.execute_sql(MULTI):
>   File
> "/usr/lib/python2.5/site-packages/django/db/models/sql/compiler.py", line
> 735, in execute_sql
>     cursor.execute(sql, params)
>   File
> "/usr/lib/python2.5/site-packages/django/db/backends/postgresql_psycopg2/base.py",
> line 44, in execute
>     return self.cursor.execute(query, args)
> DatabaseError: relation "n_nics_groups" does not exist
>
>
> This seems to be a bug in the ModelForm class that is not honoring the
> referenced fields that exist outside the default database. I tried
> appending the using('staff') to a few different places in the StaffForm
> class and also to the instance of StaffForm, but to no avail. Anybody else
> see this as not a bug?
>
> Furbee
>
> On Fri, Nov 4, 2011 at 1:45 PM, Tabitha Samuel 
> <tabitha.sam...@gmail.com>wrote:
>
>> I don't mean to be spamming you like this, just thought you might be
>> interested in this result:
>>
>> So I created the same tables (n_test_staff and n_nics_groups) in the
>> default gibbs database. I removed the using part in the form statement
>> (form = StaffForm(instance = Staff.objects.using('gold').get(username
>> =current_staff), so now it looks like form = StaffForm(instance =
>> Staff.objects.get(username =current_staff) and it works fine,
>> everything is getting displayed in the view perfectly!!
>>
>> Problem is that those two tables have to live in the other database -
>> gold. Not sure how to proceed from here. I may just have to remove the
>> foreign key reference for the time being and update it manually in the
>> code, until a fix can be found for this.
>>
>> Tabitha
>>
>> On Nov 4, 3:19 pm, Tabitha Samuel <tabitha.sam...@gmail.com> wrote:
>> > I found this patch for the raw function (https://
>> > code.djangoproject.com/attachment/ticket/13805/manager.patch), because
>> > according to this ticket (https://code.djangoproject.com/ticket/
>> > 13805), .raw does not work in a multi db env. So this is what I have:
>> >
>> > in django/db/models/manager.py, I have created a new function:
>> > def raw(self, raw_query, params=None, using=None, *args, **kwargs):
>> >         if using is None:
>> >             using = self._db
>> >         print using
>> >         return RawQuerySet(raw_query=raw_query, model=self.model,
>> > params=params, using=using, *args, **kwargs)
>> >
>> > The print using returns "gold" so I know it is using this method.
>> >
>> > Now, I have
>> >   form = StaffForm(instance = Staff.objects.raw("SELECT s.*,
>> > g.n_group_name FROM n_test_staff s LEFT JOIN n_nics_groups g
>> > ON(g.n_group_number = s.nics_group) WHERE s.username =
>> > 'tsamuel'",None,"gold"))
>> > in my view and I am still getting the error:
>> > AttributeError at /staff/staffinfo
>> > 'RawQuerySet' object has no attribute '_meta'
>> >
>> > This is the traceback:
>> > Traceback:
>> > File "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > core/handlers/base.py" in get_response
>> >   111.                         response = callback(request,
>> > *callback_args, **callback_kwargs)
>> > File "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > contrib/auth/decorators.py" in _wrapped_view
>> >   23.                 return view_func(request, *args, **kwargs)
>> > File "/nics/a/home/tsamuel/tssandbox/gibbs/utils/decorators.py" in
>> > decorate
>> >   11.         return view_func(request, *args, **kws)
>> > File "/nics/a/home/tsamuel/tssandbox/gibbs/../gibbs/staff/views.py" in
>> > staff_info
>> >   156.     form = StaffForm(instance = Staff.objects.raw("SELECT s.*,
>> > g.n_group_name FROM n_test_staff s LEFT JOIN n_nics_groups g
>> > ON(g.n_group_number = s.nics_group) WHERE s.username =
>> > 'tsamuel'",None,"gold"))
>> > File "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > forms/models.py" in __init__
>> >   237.             object_data = model_to_dict(instance, opts.fields,
>> > opts.exclude)
>> > File "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > forms/models.py" in model_to_dict
>> >   110.     opts = instance._meta
>> >
>> > Exception Type: AttributeError at /staff/staffinfo
>> > Exception Value: 'RawQuerySet' object has no attribute '_meta'
>> >
>> > On Nov 4, 2:49 pm, Tabitha Samuel <tabitha.sam...@gmail.com> wrote:
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > > One thought I have is that the using() is messing things up. Would it
>> > > be possible for you to create a second non-default db, throw these two
>> > > tables in there and then try the same thing? If that works for you,
>> > > then I must have a ghost sitting in my system! :-|
>> >
>> > > On Nov 4, 2:28 pm, Furbee <furbeena...@gmail.com> wrote:
>> >
>> > > > That is very strange... I recreated this on my development system
>> and it
>> > > > worked fine. I looked for Django bugs, but haven't found any
>> related to
>> > > > this issue. To be clear, the table n_nics_groups definitely exists
>> in the
>> > > > same database as n_test_staff, right? It does in mine because I
>> used python
>> > > > manage.py syncdb to create them from the models. If so, maybe we
>> should try
>> > > > to create a raw() query to see if the system has a bug creating the
>> query.
>> > > > This should be similar:
>> >
>> > > > form = StaffForm(instance = Staff.objects.raw("SELECT s.*,
>> g.n_group_name
>> > > > FROM n_test_staff s LEFT JOIN n_nics_groups g ON(g.n_group_number =
>> > > > s.nics_group) WHERE s.username = 'tsamuel'))
>> >
>> > > > If that throws an error, we may have a problem in the DB layer.
>> >
>> > > > Thanks,
>> >
>> > > > Furbee
>> >
>> > > > On Fri, Nov 4, 2011 at 10:29 AM, Tabitha Samuel <
>> tabitha.sam...@gmail.com>wrote:
>> >
>> > > > > The error that I'm getting is on the second form instantiation,
>> that
>> > > > > is on the line:
>> >
>> > > > > form = StaffForm(instance =
>> Staff.objects.using('gold').get(username =
>> > > > > current_staff)
>> > > > > where current_staff='tsamuel' for instance
>> >
>> > > > > This is the traceback of the error that I get when I do a print
>> form
>> > > > > right after getting the form:
>> > > > > Environment:
>> >
>> > > > > Request Method: GET
>> > > > > Request URL:http://watermelon.nics.utk.edu:8004/staff/staffinfo
>> >
>> > > > > Django Version: 1.3.1
>> > > > > Python Version: 2.6.2
>> > > > > Installed Applications:
>> > > > > ['django.contrib.auth',
>> > > > >  'django.contrib.contenttypes',
>> > > > >  'django.contrib.sessions',
>> > > > >  'django.contrib.sites',
>> > > > >  'gibbs.quartermaster',
>> > > > >  'gibbs.userportal',
>> > > > >  'gibbs.reports',
>> > > > >  'gibbs.events',
>> > > > >  'gibbs.job_stats',
>> > > > >  'gibbs.simulator',
>> > > > >  'gibbs.staff']
>> > > > > Installed Middleware:
>> > > > > ('django.contrib.csrf.middleware.CsrfViewMiddleware',
>> > > > >  'django.middleware.common.CommonMiddleware',
>> > > > >  'django.contrib.csrf.middleware.CsrfResponseMiddleware',
>> > > > >  'django.contrib.sessions.middleware.SessionMiddleware',
>> > > > >  'django.contrib.auth.middleware.AuthenticationMiddleware')
>> >
>> > > > > Traceback:
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > core/handlers/base.py" in get_response
>> > > > >  111.                         response = callback(request,
>> > > > > *callback_args, **callback_kwargs)
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > contrib/auth/decorators.py" in _wrapped_view
>> > > > >  23.                 return view_func(request, *args, **kwargs)
>> > > > > File "/nics/a/home/tsamuel/tssandbox/gibbs/utils/decorators.py" in
>> > > > > decorate
>> > > > >  11.         return view_func(request, *args, **kws)
>> > > > > File
>> "/nics/a/home/tsamuel/tssandbox/gibbs/../gibbs/staff/views.py" in
>> > > > > staff_info
>> > > > >  159.     print form
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > utils/encoding.py" in __str__
>> > > > >  27.         return self.__unicode__().encode('utf-8')
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/forms.py" in __unicode__
>> > > > >  95.         return self.as_table()
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/forms.py" in as_table
>> > > > >  217.             errors_on_separate_row = False)
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/forms.py" in _html_output
>> > > > >  180.                     'field': unicode(bf),
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/forms.py" in __unicode__
>> > > > >  408.         return self.as_widget()
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/forms.py" in as_widget
>> > > > >  439.         return widget.render(name, self.value(),
>> attrs=attrs)
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/widgets.py" in render
>> > > > >  516.         options = self.render_options(choices, [value])
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/widgets.py" in render_options
>> > > > >  533.         for option_value, option_label in
>> chain(self.choices,
>> > > > > choices):
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/
>> > > > > forms/models.py" in __iter__
>> > > > >  882.             for obj in self.queryset.all():
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > models/query.py" in _result_iter
>> > > > >  107.                 self._fill_cache()
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > models/query.py" in _fill_cache
>> > > > >  772.
>> > > > > self._result_cache.append(self._iter.next())
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > models/query.py" in iterator
>> > > > >  273.         for row in compiler.results_iter():
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > models/sql/compiler.py" in results_iter
>> > > > >  680.         for rows in self.execute_sql(MULTI):
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > models/sql/compiler.py" in execute_sql
>> > > > >  735.         cursor.execute(sql, params)
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > backends/util.py" in execute
>> > > > >  34.             return self.cursor.execute(sql, params)
>> > > > > File
>> "/nics/a/applications/gibbs/python/site-packages_django/django/db/
>> > > > > backends/postgresql_psycopg2/base.py" in execute
>> > > > >  44.             return self.cursor.execute(query, args)
>> >
>> > > > > Exception Type: DatabaseError at /staff/staffinfo
>> > > > > Exception Value: relation "n_nics_groups" does not exist
>> >
>> > > > > Tabitha
>> >
>> > > > > On Nov 4, 11:31 am, Furbee <furbeena...@gmail.com> wrote:
>> > > > > > Oh no, that would not be a good thing to share! :-) That's a
>> bummer that
>> > > > > > the upgrade broke things.
>> >
>> > > > > > So, the error is being raised on this line?
>> > > > > > staff_form = StaffForm(request.POST,
>> > > > > instance=staffinstance).using('gold')
>> >
>> > > > > > Furbee
>> >
>> > > > > > On Fri, Nov 4, 2011 at 8:02 AM, Tabitha Samuel <
>> tabitha.sam...@gmail.com
>> > > > > >wrote:
>> >
>> > > > > > > So this is how I'm creating the staff form:
>> >
>> > > > > > > def staff_info(request, *args, **kws):
>> > > > > > >    class StaffForm(forms.ModelForm):
>> > > > > > >        class Meta:
>> > > > > > >          model= Staff
>> > > > > > >          ....
>> > > > > > >          ....
>> > > > > > >          ....
>> > > > > > >  if request.method == 'POST' and request.POST['event'] ==
>> > > > > > > 'choosestaff':
>> > > > > > > current_staff =
>> > > > > > > request.POST.get('selectstaff')
>> > > > > > > elif request.method == 'POST' and request.POST['event'] ==
>> > > > > > > 'editstaff':
>> > > > > > > #print
>> > > > > > > request
>> > > > > > > current_staff =
>> > > > > > > request.POST.get('username')
>> > > > > > > errors =
>> > > > > > > validate_staff(request)
>> > > > > > > if errors is not None and len(errors) ==
>> > > > > > > 0:
>> > > > > > > print...
>> >
>> > read more ยป
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To post to this group, send email to django-users@googlegroups.com.
>> To unsubscribe from this group, send email to
>> django-users+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/django-users?hl=en.
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to