Opened 4 years ago
Last modified 4 years ago
#32597 closed Bug
generic inline formsets: object has no attribute 'fk' — at Initial Version
Reported by: | Éric Tanter | Owned by: | nobody |
---|---|---|---|
Component: | Forms | Version: | 2.2 |
Severity: | Normal | Keywords: | generic field, inline formset |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Hi,
I think I'm facing a zombie-bug reminiscent of ticket #9498:
https://code.djangoproject.com/ticket/9498
From 12 years ago and marked as solved.
The setting is simple: I have a model with a generic field (with non-standard names). The corresponding inline class declares the ct_field
and ct_fk_field
as required.
If I don't try to customize the formset, then all works fine. However, as soon as I declare a formset attribute for the inline (even if I use formset=BaseInlineFormSet
), it crashes with an error:
type object 'DocumentFormSet' has no attribute 'fk'
With the debugger I traced the problem down to the execution of this method in BaseInlineFormSet (during the initialization process of the formsets):
@classmethod def get_default_prefix(cls): return cls.fk.remote_field.get_accessor_name(model=cls.model).replace('+', '')
Problem is: cls
has no field fk
(it has ct_fk_field
and ct_field
properly set, though).
In fact, the instance of BaseInlineFormSet
has a field fk
, used in many instance methods, but the class itself does not :-(
I've done the following "fix":
- redefine the get_default_prefix method to use
ct_field
instead offk
@classmethod def get_default_prefix(cls): return cls.ct_field.remote_field.get_accessor_name(model=cls.model).replace('+', '')
- at the instance methods level, I then had the same errors (
no attribute 'fk'
), so I defined:
@property def fk(self): return self.ct_field
And it works (I tried defining an empty_form
property to set an initial value of my inlines, and it behaves as expected.
Is that a known bug of 2.2? is it fixed upstream? Or am I missing something and there's some documentation somewhere explaining what to do in that case? (my fix is clearly not intended for users to do, I believe).
Thanks
Éric