Hi all, I have created a custom widget using the branch newforms-admin to represent (see code below):
To test it, create a couple of countries, then a few cities attached to those countries, and then create a new Person. In the class PersonOptions, the line "formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel, self.admin_site)" allows me to get the green cross. By clicking that cross, a popup appears and you can add a new city. Until then it's great.... ....except that once the new city is saved, the popup doesn't close. It remains blank, and if you look at the html source of that popup you'll get something like: "<script type="text/javascript">opener.dismissAddAnotherPopup(window, 7, "New York");</script>" By looking at the function "dismissAddAnotherPopup" in the file "http://127.0.0.1:8000/media/js/admin/RelatedObjectLookups.js" it seems that if the widget is not a "select" component, then it won't be refreshed. So, my questions: - How can we get that pop up window to close when the new city is saved? - How can we refresh the custom widget? - How can we put the green cross in a better place? (with the current template it is placed in the bottom left corner, which is not that visible) Thanks a lot for your help! The actual code: class Country(models.Model): name = models.CharField(max_length=50) def __unicode__(self): return self.name class City(models.Model): name = models.CharField(max_length=50) country = models.ForeignKey(Country) def __unicode__(self): return self.name class Person(models.Model): firstName = models.CharField(max_length=30) lastName = models.CharField(max_length=30) citiesLived = models.ManyToManyField(City, null=True, blank=True) def __unicode__(self): return self.firstName + " " + self.lastName from django.newforms.widgets import * from django.newforms.fields import MultipleChoiceField from django.template import Context, Template from django.newforms.util import flatatt from django.utils.encoding import force_unicode from itertools import chain from django.utils.html import escape class CitiesWidget(CheckboxSelectMultiple): template_string="""<p>{% regroup city_list|dictsort:"country" by country as cities_by_country %} {% for country in cities_by_country %} <b>{{ country.grouper }}</b><br/> {% for city in country.list|dictsort:"name" %} {{ city.html }}<br/> {% endfor %} <br/> {% endfor %}</p> """ def render(self, name, value, attrs=None, choices=()): if value is None: value = [] has_id = attrs and 'id' in attrs final_attrs = self.build_attrs(attrs, name=name) str_values = set([force_unicode(v) for v in value]) # Normalize to strings. city_list = [] for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): city = City.objects.get(id=option_value) # If an ID attribute was given, add a numeric index as a suffix, # so that the checkboxes don't all have the same ID attribute. if has_id: final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values) option_value = force_unicode(option_value) rendered_cb = cb.render(name, option_value) html = (u'%s %s' % (rendered_cb, escape(force_unicode(option_label)))) city_list.append({"country":city.country.name, "name": option_label, "html":html}) t = Template(self.template_string) c = Context({"city_list": city_list}) return t.render(c) class CitiesField(MultipleChoiceField): widget = CitiesWidget from django.contrib.admin import widgets class PersonOptions(admin.ModelAdmin): def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'citiesLived': cities = kwargs['initial'] kwargs['initial'] = [city.id for city in cities] formfield = CitiesField(**kwargs) formfield.choices = [(city.id, city.name) for city in City.objects.all()] formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel, self.admin_site) return formfield else: return super(PersonOptions,self).formfield_for_dbfield(db_field,**kwargs) admin.site.register(Country) admin.site.register(City) admin.site.register(Person, PersonOptions) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---