我正在尝试扩展下面介绍的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管理应用进行更改。
一如既往,非常感谢您的帮助!
答案 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 或更高版本。