Вопрос по – Для администратора django, как мне добавить поле в модель User и сделать его редактируемым в admin?

8

Я пытаюсь лучше понять администратора django, и в то же время я пытаюсь добавить еще одно поле к текущему администратору пользователя. В models.py я уже сделал

User.add_to_class('new_field', models.BooleanField(default=False))

и в admin.py я получил следующее (наборы полей в основном просто скопированы из django / contrib / auth / admin.py)

class AdjUserAdmin(UserAdmin):
  list_display  = UserAdmin.list_display + ('new_field',)
  list_filter   = UserAdmin.list_filter + ('new_field',)

  fieldsets = UserAdmin.fieldsets
  fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field')

Проблема в том, что, когда я делаю это, я получаю ошибку:

AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.

Я посмотрел на UserChangeForm, но, похоже, он уже правильно вводит пользователя в качестве модели. Я не уверен, почемуnew_field отсутствует в форме.

Спасибо

In regards to this being smelly code

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

In regards to the recommended way

Мне известен рекомендуемый способ создания профиля пользователя, но в определенных ситуациях я не вижу смысла в создании всей новой таблицы и дополнительном вызове в базу данных, когда все, что я хочу сохранить, - это дополнительный немного информации, такой какis_private или что-то подобное. Если я храню больше информации, то я согласен, что настройка профиля пользователя предпочтительнее.

Ваш Ответ

5   ответов
4

Желательно написать свой собственный класс профиля пользователя и присоединить его к модели User. Тогда вы можете использоватьget_profile() метод получения профиля от пользователя.

Подклассы администратора профиля от встроенного администратора также должны позволять вам редактировать профиль на странице пользователя, что почти то, что вы пытаетесь сделать.

У этого поста действительно хорошая рецензия на проблему:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

2

Просто понял это, возможно, это могло бы помочь и вам.

Поскольку вы не упоминаете, что у вас есть отдельный профиль, если вы хотите просто добавить столбец к существующему администратору пользователя, вы можете сделать следующее вadmin.py:

Сначала вы создаете пользовательского администратора путем создания подклассовUserAdmin:

class CustomUserAdmin(UserAdmin):
    list_display = UserAdmin.list_display + ('is_complete',)

    def is_complete(self, obj):
        # Example here, you can use any expression.
        return SomeOtherClass.objects.get(my_field=obj).is_complete()

    # Not required, but this gives you a nice boolean field:
    is_complete.boolean = True

Затем отмените регистрациюUserAdmin и зарегистрируйте свое собственное:

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
0

Я получил «пропущенное в форме». ошибка и обнаружил, что это связано с тем, что мое поле помечено как «редактируемое = ложное»; в модели.

17

Сначала "подключен ли он?" вопрос - Вы вручную добавили new_field в таблицу пользователей в базе данных? Конечно, Syncdb не позаботился бы об этом.

После этого я бы попытался добавить поля в существующий UserAdmin, а не восстанавливать его с нуля:

from django.contrib.auth.admin import UserAdmin

UserAdmin.list_display += ('new_field',)  # don't forget the commas
UserAdmin.list_filter += ('new_field',)
UserAdmin.fieldsets += ('new_field',)
Хм ... не знаю, почему я не подумал об этом после использования list_display = UserAdmin.list_display + (& amp; new_field & apos ;,) .. спасибо! Silfheed
Когда я использую: UserAdmin.list_display + = («никнейм») UserAdmin.list_filter + = («ник»,) UserAdmin.fieldsets + = («ник»,) & lt; ----- & gt; что-то не так, например: & lt; class & reg; django.contrib.auth.admin.UserAdmin & reg ;: (admin.E008) Значение & field; fieldsets [4] & apos; должен быть список или кортеж. & Л; ----- & GT; и я изменился на: UserAdmin.list_display + = ('' никнейм '') UserAdmin.list_filter + = ('' никнейм ',) псевдоним & apos ;,)}),) & lt; ----- & gt; эта проблема исчезла.
2

Несмотря на то, что ваша БД ищет проблемы с наличием UserProfile, это действительно то, что вам нужно для решения этой проблемы. Для этого есть две основные причины:

  1. The User Model is pretty tightly coupled to Django's authentication system and to many other plugins. Monkey patching it isn't a good idea.

  2. Django has built-in support for creating User Profiles and many extensions know how to play nicely with these. By using User Profiles (see http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users for the main discussion on this) you can benefit from that.

Если вы хотите добавить функциональность в интерфейс администратора для пользователей, эта заметка может оказаться полезной:

http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html

С Уважением,

Ян

Похожие вопросы