2015-07-03 2 views
3

Я использую 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.

Я предполагаю, что я сделал переопределение в неправильном месте, с полями, отображаемыми в форме, но не в методах сохранения. Я не мог найти упоминания об этом в документах: кто-нибудь знает, как это сделать?

+0

Причина вы получаете 'peewee.UserDoesNotExist', скорее всего потому, что SQL генерируется после изменения имени пользователя что-то вроде' UPDATE some_table SET (...) WHERE ID = new_username', который, очевидно, Безразлично не существует. Я бы настоятельно рекомендовал не использовать первичный идентификатор пользовательского набора. Это намного безопаснее и проще в использовании автоматически увеличивающегося целочисленного id. – IanAuld

+2

Вы создаете много ненужной работы для вас и вашей базы данных, редактируя первичные ключи. Придерживайтесь целых чисел или UUID и используйте уникальные ограничения для значимых полей, которые должны быть уникальными, например, имя пользователя. – dirn

ответ

2

Если у вас есть нецелый первичный ключ, вы должны позвонить save() с помощью force_insert=True, чтобы добавить новую строку.

http://docs.peewee-orm.com/en/latest/peewee/models.html#non-integer-primary-keys-composite-keys-and-other-tricks

+0

Спасибо. Я, наконец, решил держаться подальше от модификации pk, но в случае, когда мне когда-либо понадобится, теперь я знаю, как (я тестировал, и это сработало)! – Hippo

Смежные вопросы