On Thu, May 21, 2009 at 10:45:06AM +1000, Brian May wrote:
> A frequent problem people seem to have with Django[1] is the default
> interface for selecting foreign keys is slow and clumsy to use if there
> are lots of selections. To the best of my knowledge there is no solution
> included with Django.
> 
> So I have created my own field type that is derived from the
> django.forms.CharField form type. The Clean method will look up the
> value in the db with the matching name, and return the result. Simple.
> Efficient. No need to repeatedly query the database/objects for the same
> data, if the same foreign key appears multiple times on the same form. I
> like it.
> 
> The problem comes to using this with the admin interface. I created a
> class derived from django.db.models.ForeignKey that overrides the
> formfield method to use my field type. Unfortunately this does not work[2].

No answers, I will not use the forms interface then. Maybe that was the wrong
approach?

My current approach is to create my custom field type, like:

from django import forms
from microcomaustralia.zoph import models

=== cut ===
class Person_Field(forms.CharField):

    def __init__(self, queryset=None, to_field_name=None, *args, **kwargs):
        super(Person_Field, self).__init__(*args, **kwargs)

    def clean(self, value):
        value=super(Person_Field, self).clean(value)

        if value in ('',None):
            return None

        s = value.split(" ")
        try:
            if len(s) == 0:
                return None
            elif len(s) == 1:
                clean=models.Person.objects.get(first_name=s[0])
            elif len(s) == 2:
                
clean=models.Person.object.objects.get(first_name=s[0],last_name=s[1])
            elif len(s) == 3:
                
clean=models.Person.object.objects.get(first_name=s[0],middle_name=s[1],last_name=s[2])
            else:
                return None
        except self.object.DoesNotExist, e:
            raise ValidationError(u"Cannot find object %s: %s" % (value,e))

        return clean
=== cut ===

This works fine in a normal form. The __unicode__ method is used to convert the
object into a string, and this is displayed.

If I use it in a model form however, Django will convert the database object to
the primary key value before displaying it to the widget.

This seems so wrong, as I think the widget should be called in the same manner
regardless of if it is a normal form or model form.

How do I override the fields for foreign keys?
-- 
Brian May <br...@microcomaustralia.com.au>

--~--~---------~--~----~------------~-------~--~----~
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