Я использую Flask-Admin для моего проекта на основе Flask. В нем у меня есть некоторые модели (с использованием peewee), где первичный ключ задан пользователем, например username
для User
. Однако Flask-Admin не показывает эти поля на страницах создания/редактирования модели.Сделать поля первичного ключа редактируемыми в Flask-Admin
Теперь, когда я пытаюсь создать нового пользователя, кнопка «Сохранить» дает ошибку peewee.UserDoesNotExist
, а «Сохранить & Добавить» говорит «Запись успешно создана» дважды, но на самом деле ничего не делает.
Я использовал расширенный метод save()
, чтобы автоматически генерировать имя пользователя из имени, если оно не установлено, но проблема сохраняется, даже когда я удалил переопределение.
Код ...
Вот что моя модель пользователя выглядит следующим образом:
# import peewee as pw
class User(BaseModel, UserMixin):
username = pw.CharField(32, primary_key=True)
password = pw.CharField(512, null=True)
name = pw.CharField(64)
# ... other fields not shown ... #
def save(self, *args, **kwargs):
# Set the username if field is blank
if self.username == 'auto' or not self.username:
self.username = self.name.replace(' ', '').lower()
# Do the real save
super(User, self).save(*args, **kwargs)
Вот мой админ код:
Пробуя StuFF
позже я пытался переопределить метод get_form()
, чтобы использовать wtfpeewee
непосредственно и позволяют рк, как это:
# from wtfpeewee.orm import model_form
class AdminModelUser(ModelView):
...
def get_form(self):
return model_form(User, allow_pk=True)
Теперь поле показывает, но экономия до сих пор не работает. Когда я редактирую имя пользователя существующего пользователя, администратор говорит: «Запись была успешно сохранена», но она не сохраняется. И когда я пытаюсь создать нового пользователя, я все равно получаю ошибку peewee.UserDoesNotExist
.
Я предполагаю, что я сделал переопределение в неправильном месте, с полями, отображаемыми в форме, но не в методах сохранения. Я не мог найти упоминания об этом в документах: кто-нибудь знает, как это сделать?
Причина вы получаете 'peewee.UserDoesNotExist', скорее всего потому, что SQL генерируется после изменения имени пользователя что-то вроде' UPDATE some_table SET (...) WHERE ID = new_username', который, очевидно, Безразлично не существует. Я бы настоятельно рекомендовал не использовать первичный идентификатор пользовательского набора. Это намного безопаснее и проще в использовании автоматически увеличивающегося целочисленного id. – IanAuld
Вы создаете много ненужной работы для вас и вашей базы данных, редактируя первичные ключи. Придерживайтесь целых чисел или UUID и используйте уникальные ограничения для значимых полей, которые должны быть уникальными, например, имя пользователя. – dirn