From e4801b0faa3a9af69f5e1f06796be079e4ab9476 Mon Sep 17 00:00:00 2001 From: Sean McCarthy Date: Mon, 1 Aug 2022 10:46:07 -0600 Subject: [PATCH 1/2] Raise a helpful error if the primary key field is not included in the inline_models' "form_columns" Based on this error: https://stackoverflow.com/questions/34313253/flask-admin-inline-modelling-passing-form-arguments-throws-attributeerror --- flask_admin/model/fields.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/flask_admin/model/fields.py b/flask_admin/model/fields.py index ed28c7e88..14dca753f 100644 --- a/flask_admin/model/fields.py +++ b/flask_admin/model/fields.py @@ -119,6 +119,13 @@ def __init__(self, form_class, pk, form_opts=None, **kwargs): self.form_opts = form_opts def get_pk(self): + """Get the primary key value from the form""" + + if self._pk not in self.form: + raise AttributeError( + 'Primary key field "%s" not included in the inline_models "form_columns": %s' + % (self._pk, self.form._fields.keys()) + ) if isinstance(self._pk, (tuple, list)): return tuple(getattr(self.form, pk).data for pk in self._pk) From 7ba0195a0b70702fa3504e70884ce013a25baacd Mon Sep 17 00:00:00 2001 From: Sean McCarthy Date: Mon, 1 Aug 2022 11:01:37 -0600 Subject: [PATCH 2/2] putting helpful message in try: except --- flask_admin/model/fields.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/flask_admin/model/fields.py b/flask_admin/model/fields.py index 14dca753f..d49841c94 100644 --- a/flask_admin/model/fields.py +++ b/flask_admin/model/fields.py @@ -120,17 +120,19 @@ def __init__(self, form_class, pk, form_opts=None, **kwargs): def get_pk(self): """Get the primary key value from the form""" + try: + if isinstance(self._pk, (tuple, list)): + return tuple(getattr(self.form, pk).data for pk in self._pk) + + return getattr(self.form, self._pk).data + except AttributeError: + if self._pk not in self.form: + raise AttributeError( + 'Primary key field "%s" is required in inline_models "form_columns". Available form fields: %s' + % (self._pk, self.form._fields.keys()) + ) + raise - if self._pk not in self.form: - raise AttributeError( - 'Primary key field "%s" not included in the inline_models "form_columns": %s' - % (self._pk, self.form._fields.keys()) - ) - - if isinstance(self._pk, (tuple, list)): - return tuple(getattr(self.form, pk).data for pk in self._pk) - - return getattr(self.form, self._pk).data def populate_obj(self, obj, name): for name, field in iteritems(self.form._fields):