Thank you. The code fixed my problem.
On Dec 16, 2009, at 1:48 PM, Tim Valenta wrote:
> Well, you're probably getting the error on your 'extra' inlines.
> self.instance is unbound in that case, and so self.instance.providers
> cannot be looked up.
>
> I wrote a little thing to fetch a proper object though... just be sure
> to include your parent model's field in your fields on the inline.
> Then you can use this generic utility function... you can pick pieces
> out of it if you think it wiser. I just took the sledgehammer to the
> wall to get my task accomplished:
>
> def implied_inline_fk(form, implied_model_class, field_name=None):
> if not field_name:
> field_name = implied_model_class.__name__.lower()
> try:
> return implied_model_class.objects.get(pk=tuple(i[0] for i in
> form.fields[field_name].widget.choices)[1])
> except IndexError:
> # In the event that both the base 'original' object and inline
> object don't exist,
> # we need to just throw out the possibility of filtering values.
> return None
> except KeyError:
> raise KeyError("'%s' must be included in the inline ModelAdmin's
> 'fields' attribute." % field_name)
>
>
>
> You could then use this in your PartnerForm:
>
> class PartnerForm(forms.ModelForm):
> def __init__(self, *args, **kwargs):
> super(PartnerForm, self).__init__(*args, **kwargs)
> if 'instance' in kwargs:
> # Existing instance-- safe to use
> self.fields['default_provider'].queryset =
> self.instance.providers
> else:
> # 'extra' unbound object. Not safe.
> # Must derive through some other means.
> parentInstance = implied_inline_fk(self, PARENTMODEL,
> 'field_name_to_parent_model')
> self.fields['default_provider'].queryset =
> parentInstance.somelookup_to_provider_filter
>
> Note that sometimes this doesn't really work, depending on your model
> hierarchy. You might have to throw in the towel on 'extra' inlines.
> The key is to filter only when it's bound, and to work around the
> filter if it's not bound.
>
> Tim
>
>
> On Dec 16, 11:10 am, Eric Chamberlain <[email protected]> wrote:
>> I'd like PartnerRegistration's default_provider field to be filtered in
>> PartnerRegistrationInline, like how Partner's default_provider field is
>> filtered in PartnerAdmin.
>>
>> When I try the code below, I get a DoesNotExist exception in:
>>
>> self.fields['default_provider'].queryset =
>> self.instance.partner.providers
>>
>> raise self.field.rel.to.DoesNotExist
>>
>> What am I doing wrong?
>>
>> class Partner(Model):
>> id = UUIDField(primary_key=True)
>> providers = ManyToManyField('Provider',
>> related_name='provider_partners', blank=True, null=True)
>> default_provider = ForeignKey('Provider', null=True, blank=True,
>> help_text='The calling service used to make calls through by default when
>> using this partner')
>>
>> class PartnerForm(forms.ModelForm):
>> """ Filter and only show what belongs to this partner."""
>>
>> def __init__(self, *args, **kwargs):
>> super(PartnerForm, self).__init__(*args,**kwargs)
>> self.fields['default_provider'].queryset = self.instance.providers
>>
>> class PartnerRegistration(Model):
>> id = UUIDField(primary_key=True)
>> partner = ForeignKey('Partner',unique=True)
>> default_provider = ForeignKey('Provider',verbose_name='default calling
>> service', help_text='User this calling service when response doesn\'t
>> specify one.')
>>
>> class PartnerRegistrationForm(forms.ModelForm):
>> """ Filter and only show what belongs to this partner."""
>>
>> def __init__(self, *args, **kwargs):
>> super(PartnerRegistrationForm, self).__init__(*args,**kwargs)
>> self.fields['default_provider'].queryset =
>> self.instance.partner.providers
>>
>> class PartnerRegistrationInline(StackedInline):
>> model = PartnerRegistration
>> form = PartnerRegistrationForm
>>
>> class PartnerAdmin(ModelAdmin):
>> form = PartnerForm
>>
>> inlines = [ PartnerRegistrationInline, ]
>
> --
>
> 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.
>
>
--
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.