I guess the form object is not holding the nics_group object, in this case,
you could send the group information (all groups in one array or other
object, and the selected group in another variable) back to the template as
a separate object. However, the suggested paradigm is using Database
Routers. With the database routers, you can force the instances of the
NICSGroupType and Staff to use the gold database. More details here:
https://docs.djangoproject.com/en/1.3/topics/db/multi-db/#automatic-database-routing.
I submitted a bug ticket over the weekend (
https://code.djangoproject.com/ticket/17167), but it was closed by a
contributor who seemed to misunderstand the situation. The issue is
somewhere in the ModelForm class, since everything works UNTIL you use the
staff object as an instance to the ModelForm StaffForm object. The
ModelForm class is looking to the default database for referential objects.
There are not arguments I can find to forcefully tell ModelForm to use a
non-default database. So, it may be that Database Routers are the only way
you can get ModelForm to look for NICSGroupType in the database 'gold.'

Furbee

On Sun, Nov 6, 2011 at 3:04 PM, Tabitha Samuel <tabitha.sam...@gmail.com>wrote:

> Hey thanks a bunch for the workaround. Maybe I am doing something
> wrong, but this is what I'm getting when I implement it and it really
> seems weird..
>
> in my view I have:
>    staff_person =
> Staff.objects.using('gold').get(username=current_staff)
>    form = StaffForm(instance = staff_person)
>    group
>
> =NICSGroupType.objects.using('gold').get(n_group_number=staff_person.nics_group.n_group_number)
>    form.nics_group = group
>    print form.nics_group
>    print form
>
> The first print gives me "3" which is correct. The print form on the
> other hand gives me the same:
> Exception Type: DatabaseError at /staff/staffinfo
> Exception Value: relation "n_nics_groups" does not exist
>
> If I comment out that print and render the template, I get pretty much
> the same error:
> Exception Type: TemplateSyntaxError at /staff/staffinfo
> Exception Value: Caught DatabaseError while rendering: relation
> "n_nics_groups" does not exist
> and the problem line in the template is: <tr><td>NICS Group: </
> td><td>{{form.nics_group}}
>
> So the question is how can it print the group number when I do a print
> form.group_number but exception out when I do a print form?
>
> Tabitha
>
> On Nov 5, 11:26 am, Furbee <furbeena...@gmail.com> wrote:
> > 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
> >
> > ...
> >
> > 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