Сделайте поля первичного ключа редактируемыми в 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 добавить новую строку.

http://docs.peewee-orm.com/en/latest/peewee/models.html

Другие вопросы по тегам