Сделайте поля первичного ключа редактируемыми в Flask-Admin
Я использую Flask-Admin для своего проекта на основе Flask. В нем у меня есть несколько моделей (использующих peewee), в которых первичный ключ задается пользователем, например username
для User
, Однако Flask-Admin не показывает эти поля на страницах создания / редактирования модели.
Теперь, когда я пытаюсь создать нового пользователя, кнопка "Сохранить" дает peewee.UserDoesNotExist
ошибка, и "Сохранить и добавить" говорит "Запись успешно создана" дважды, но на самом деле ничего не делает.
Я продлил save()
метод автоматической генерации имени пользователя из имени, если оно не установлено, но проблема сохранялась даже после удаления переопределения.
Код...
Вот как выглядит моя модель User:
# 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)
Вот мой код администратора:
# from flask_admin.contrib.peewee.view import ModelView
class AdminModelUser(ModelView):
can_create = True
column_list = ('username', 'name', 'group', 'active')
admin.add_view(AdminModelUser(User, name='Users', category='Accounts'))
Пробовать вещи
Я позже попытался переопределить 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
ошибка.
Я предполагаю, что я сделал переопределение не в том месте, поля отображаются в форме, но не в методах сохранения. Я не нашел упоминаний об этом в документации: кто-нибудь знает, как это сделать?
1 ответ
Когда у вас есть нецелочисленный первичный ключ, вы должны позвонить save()
с force_insert=True
добавить новую строку.