与GeoDjango管理员(OSMGeoAdmin)一起使用自定义UserCreationForm

与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

我有一个简单的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 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)