Django自定义用户---在admin中编辑新的CustomUser字段

时间:2018-11-17 21:13:00

标签: python django admin

我正在尝试扩展下面介绍的William Vincent的教程:

https://wsvincent.com/django-custom-user-model-tutorial/

我正尝试向通过django.contrib.auth.models的AbstractUser导入扩展的CustomerUser模型添加新字段:

users / models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager

class CustomUserManager(UserManager):
    pass

class CustomUser(AbstractUser):
    bio         = models.TextField(max_length=500, blank=True)

    objects = CustomUserManager()

    def __str__(self):
        return self.username

我在上面的模型中添加了'bio'字段,但是当我通过django管理门户访问用户时,我看不到其中带有django打包的默认管理字段的新'bio'字段: :个人信息:名字,姓氏,电子邮件地址等。

我的CustomUser应用程序已这样注册到管理门户(遵循上述教程):

作为对我自己的测试,我能够在list_display中成功显示生物字段(按预期显示空白)。重申一下,我的问题是单击编辑用户时无法更新此字段。好消息是django获得了我新的“生物”领域的迁徙。

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['username', 'email','is_staff', 'bio']

admin.site.register(CustomUser, CustomUserAdmin)

我的猜测是,我正在寻找的解决方案与编辑管理表单有关。这是我的用户应用程序中的内容(来自教程)。

users / forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username', 'email')

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = ('username', 'email')

诚然,我对上面的form.py文件中发生的事情不太了解。我怀疑这可能与我通过管理门户访问的实际用户编辑表单无关,所以我可能只需要弄清楚如何对默认的Django管理应用进行更改。

一如既往,非常感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

Andy尝试将其添加到您的管理类中:

const regex = /ID_.*?\.pdf/gm;
const str = `<ul>
<li><a href="/questions/237104/ID_2556.pdf"><a href="/questions/237104/ID_2556.pdf">Click here to
download.</a></li>
<li><a href="/questions/237104/ID_37.pdf">Click
here to download.</a></li>
<li><a
href="/questions/237104/ID_29997.pdf">Click here to download.</a></li>
<li><a href="/questions/237104/ID_0554.pdf">Click here to
download.</a></li>
</ul>`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

您还可以添加其他集,例如与权限有关的另一部分,并且可以显示有关is_active或组的信息。您可以这样做:

fieldsets = (
        (('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
    )

您可以仅在list_display下方插入字段集。对于不想在管理员中进行编辑的字段,还有一个readonly_fields。

答案 1 :(得分:3)

“ fieldsets +”方法比不得不再次写出所有默认字段要好得多。

fieldsets = UserAdmin.fieldsets + (
    (None, {'fields': ('some_extra_data',)}),
)

答案 2 :(得分:1)

要将“bio”字段添加到“个人信息”部分而不是仅添加到用户管理员的末尾,并且无需指定每个现有字段,您可以构造一个新的 fieldsets 属性父类,同时只将新的“生物”字段添加到“个人信息”部分并保留其他所有内容。

如果您只是附加到父级的 fieldsets 属性,那么该字段将出现在页面底部,而不是“个人信息”部分的末尾。

此代码复制了父项的 fieldsets 属性,除了“个人信息”部分中的 fields 元组附加了“bio”之外,所有内容都保持原样。

users/admin.py中:

class CustomUserAdmin(UserAdmin):
    # Add a "bio" field to the User admin page.
    fieldsets = tuple(
        # For the "Personal info" fieldset, drill down to the fields,
        # preserving everything else.
        (fieldset[0], {
            # Preserve any entries in the dict other than "fields".
            **{key: value for (key, value) in fieldset[1].items() if key != 'fields'},
            # Add the "bio" field to the existing fields
            'fields': fieldset[1]['fields'] + ('bio',)
        })
        # Preserve any fieldsets other than "Personal info".
        if fieldset[0] == 'Personal info'
        else fieldset
        for fieldset in UserAdmin.fieldsets
    )

注意: {**some_dict, new_key: new_value} 语法要求 Python 3.5 或更高版本。