Как добавить пользовательские поля модели пользователя на страницу настроек пользователя Wagtail?
Я создаю сайт wagtail. Я следовал инструкциям, найденным в документации, и мои дополнительные поля отображаются в формах редактирования и создания пользователя, расположенных по адресу [url сайта]/admin/users/[id пользователя]. Однако я хочу, чтобы они также отображались на странице настроек учетной записи, доступ к которой осуществляется слева внизу. Эта страница вроде бы описывает то, что я хочу сделать, но я не понимаю инструкций, которые она дает.
У меня есть приложение user, и мои настройки указывают AUTH_USER_MODEL на модель User в нем. Мой models.py в этом приложении выглядит следующим образом
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
id = models.AutoField(primary_key=True)
bio = models.CharField(blank=True, null=True, max_length=2048)
nickname = models.CharField(blank=True, null=True, max_length=64)
def __str__(self):
"""String representation of this user"""
return self.get_full_name()
и мой forms.py имеет вид
from django import forms
from django.utils.translation import gettext_lazy as _
from wagtail.users.forms import UserEditForm, UserCreationForm
class CustomUserEditForm(UserEditForm):
nickname = forms.CharField(required=False, label=_("Nickname"))
bio = forms.CharField(required=False, label=_("Bio"))
class CustomUserCreationForm(UserCreationForm):
nickname = forms.CharField(required=False, label=_("Nickname"))
bio = forms.CharField(required=False, label=_("Bio"))
Из документации следует, что я хочу добавить что-то вроде этого в тот же самый forms.py:
class CustomSettingsForm(forms.ModelForm):
nickname = forms.CharField(required=False, label=_("Nickname"))
bio = forms.CharField(required=False, label=_("Bio"))
class Meta:
model = django.contrib.auth.get_user_model()
fields = [...]
и это в (иначе пустой) hooks.py:
from wagtail.admin.views.account import BaseSettingsPanel
from wagtail import hooks
from .forms import CustomSettingsForm
@hooks.register('register_account_settings_panel')
class CustomSettingsPanel(BaseSettingsPanel):
name = 'custom'
title = "My custom settings"
order = 500
form_class = CustomSettingsForm
form_object = 'user'
Я пробовал много вариаций на эту тему, и я не могу заставить что-то работать. Обычно я не получаю новых полей в панели настроек учетных записей, и эта ошибка на странице редактирования:
TypeError at /admin/users/1/ sequence item 0: expected str instance, ellipsis found
Все, что я хочу сделать, это позволить пользователю изменять эти дополнительные поля из панели настроек пользователя, поскольку не все пользователи будут иметь права на редактирование модели пользователя (которая находится в /admin/users).
"expected str instance, ellipsis found" звучит так, как будто в вашем коде буквально присутствует fields = [...]
. Пример в документации ожидает, что вы поместите фактические имена полей в этот список. Так что, возможно, fields = ['bio', 'nickname']
?
Как заметил @cnk, массив fields должен содержать ['bio', 'nickname']. Однако основная проблема была довольно глупой. В документации сказано, что код, содержащий @hooks.register('register_account_settings_panel')
, нужно поместить в hooks.py
. Я не заметил, что буквально каждый второй файл hooks называется wagtail_hooks.py
. Изменение имени файла на wagtail_hooks.py
заставило все работать, как ожидалось.