Как добавить пользовательские поля модели пользователя на страницу настроек пользователя 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 заставило все работать, как ожидалось.

Вернуться на верх