Opened 4 years ago

Last modified 4 years ago

#32597 closed Bug

generic inline formsets: object has no attribute 'fk' — at Version 1

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 (last modified by Éric Tanter)

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).

I've done the following "fix":

  1. redefine the get_default_prefix method to use ct_field instead of fk
  @classmethod
  def get_default_prefix(cls):
      return cls.ct_field.remote_field.get_accessor_name(model=cls.model).replace('+', '')
  1. 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

Change History (1)

comment:1 by Éric Tanter, 4 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top