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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---