与GeoDjango管理员(OSMGeoAdmin)一起使用自定义UserCreationForm
我有一个简单的Django应用程序,它有一个自定义的用户模型,该模型基于的与GeoDjango管理员(OSMGeoAdmin)一起使用自定义UserCreationForm,django,django-forms,django-admin,geodjango,Django,Django Forms,Django Admin,Geodjango,我有一个简单的Django应用程序,它有一个自定义的用户模型,该模型基于的AbstractCUser,它使用电子邮件地址从用户模型中删除用户名。在用户模型上,我定义了一个存储用户当前位置的PointField字段 型号.py Django==2.2.1 GDAL==2.3.2 django-username-email==2.2.4 from django.contrib.gis.db import models as gis_models from cuser.models import A
AbstractCUser
,它使用电子邮件地址从用户模型中删除用户名。在用户模型上,我定义了一个存储用户当前位置的PointField
字段
型号.py
Django==2.2.1
GDAL==2.3.2
django-username-email==2.2.4
from django.contrib.gis.db import models as gis_models
from cuser.models import AbstractCUser
class User(AbstractCUser):
"""Custom user model that extends AbstractCUser."""
current_location = gis_models.PointField(null=True, blank=True,)
from django.contrib.gis import admin
from django.contrib.auth import get_user_model
from .forms import CustomUserCreationForm, CustomUserChangeForm
class CustomUserAdmin(admin.OSMGeoAdmin):
model = get_user_model()
add_form = CustomUserCreationForm # <- there seems to be a problem here
form = CustomUserChangeForm
list_display = ['email', 'last_name', 'first_name']
readonly_fields = ['last_login', 'date_joined']
admin.site.register(get_user_model(), CustomUserAdmin)
我想在Django admin中注册这个模型,这样我就可以注册新用户,并使用地图小部件查看/设置他们的位置。如果我将基于admin.OSMGeoAdmin
的自定义用户管理员与自定义用户更改表单结合使用,则这种方式有效:
admin.py
Django==2.2.1
GDAL==2.3.2
django-username-email==2.2.4
from django.contrib.gis.db import models as gis_models
from cuser.models import AbstractCUser
class User(AbstractCUser):
"""Custom user model that extends AbstractCUser."""
current_location = gis_models.PointField(null=True, blank=True,)
from django.contrib.gis import admin
from django.contrib.auth import get_user_model
from .forms import CustomUserCreationForm, CustomUserChangeForm
class CustomUserAdmin(admin.OSMGeoAdmin):
model = get_user_model()
add_form = CustomUserCreationForm # <- there seems to be a problem here
form = CustomUserChangeForm
list_display = ['email', 'last_name', 'first_name']
readonly_fields = ['last_login', 'date_joined']
admin.site.register(get_user_model(), CustomUserAdmin)
当我在Django admin中打开现有的用户记录时,所需的字段将按预期显示,当前位置将显示在地图上。但是,同样的表单似乎也用于用户创建(即,添加表单
无效),这使得无法通过管理员添加新用户,因为密码设置功能未正确嵌入(请参见屏幕截图)
问题似乎在于OSMGeoAdmin
,与标准的UserAdmin
相比,它没有add\u form
属性
在这种情况下,有没有办法指定自定义用户创建表单(理想情况下,django username email
提供的UserCreationForm
,同时保持在用户更改表单的地图上显示点域的能力?您需要覆盖get_form
类似于django.contrib.auth.admin.UserAdmin
的方式
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = get_user_model()
exclude = ('username',)
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = get_user_model()
fields = (
'email',
'first_name',
'last_name',
'current_location',
# ...
)
您需要覆盖get_form
,类似于django.contrib.auth.admin.UserAdmin
所做的操作
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = get_user_model()
exclude = ('username',)
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = get_user_model()
fields = (
'email',
'first_name',
'last_name',
'current_location',
# ...
)
根据schillingt的建议,这是我最终使用的代码:
def get_form(self, request, obj=None, **kwargs):
"""
Use special form during user creation
"""
defaults = {}
if obj is None:
defaults['form'] = self.add_form
defaults.update(kwargs)
return super().get_form(request, obj, **defaults)
根据schillingt的建议,这是我最终使用的代码:
def get_form(self, request, obj=None, **kwargs):
"""
Use special form during user creation
"""
defaults = {}
if obj is None:
defaults['form'] = self.add_form
defaults.update(kwargs)
return super().get_form(request, obj, **defaults)