Thanks Karen.

I removed the custom form from admin.py and added a constructor to the
model:

def __init__(self, *args, **kwargs):
  super(BannerImage, self).__init__(*args, **kwargs)
  self._meta.get_field('url')._choices = get_urls()

It seems to work now.

Keith

On Dec 9, 2:52 pm, "Karen Tracey" <[EMAIL PROTECTED]> wrote:
> On Tue, Dec 9, 2008 at 1:58 PM, lingrlongr <[EMAIL PROTECTED]> wrote:
>
> > I have a function called get_urls that returns a list of absolute_urls
> > for various models in the same project.  This function is used for
> > another model in a way so that when a particular model appears on the
> > site, I can choose which part of the site this model links to.
>
> > # utils.py
> > def get_urls():
> >  urls = []
> >  for flatpage in FlatPage.objects.order_by('title')
> >    urls.append(flatpage.url, '%s: %s' % ('Flatpage',
> > flatpage.title),))
> >  return urls
>
> > There are more objects, this is just a sample with the well-known
> > FlatPage model.
>
> > The particular model I use this with looks like this:
>
> > # models.py
> > from utils import get_urls
> > class BannerImage(models.Model):
> >  image = models.ImageField(etc)
> >  url = models.CharField(max_length=100, choices=get_urls())
> >  etc...
>
> Here you have put your call to get_urls() in code that is executed only when
> the class is defined, not each time the class is instantiated.  You probably
> want to read the last paragraph of the description of choices here:
>
> http://docs.djangoproject.com/en/dev/ref/models/fields/#choices
>
> > So it turned out that the admin seemed to be caching the choices.  So,
> > if I added a new flatpage, it would not be listed there until I
> > restarted the webserver.  So instead of referring to
> > Flatpage.objects.etc... directly in get_urls, I made a function that
> > returns the queryset instead:
>
> Admin was not caching anything, it is Python that only executes the code
> once given where it had been placed.
>
> > # utils.py
> > def get_flatpages():
> >  return FlatPage.objects.order_by('title')
>
> > Problem still seemed to exist.  I tried making a custom ModelForm in
> > admin.py for this BannerImage model:
>
> > # admin.py
> > from utils import get_urls
> > class BannerImageForm(forms.ModelForm):
> >  url = forms.ChoiceField(choices=get_urls())
> >  class Meta:
> >    model = BannerImage
>
> Here you have still put the determination of choices into code that is only
> executed when the class (this time the form class) is defined.  You could
> fix it for the form case by moving the setting of choices into an __init__
> routine for the form.
>
> Karen
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to