我正在制作一个带有自定义用户的django应用程序。我在下面概述了我的问题的关键组件,缺少的代码用“…”表示。我的自定义用户模型具有以下外键关系:
class MyCustomUser(models.AbstractBaseUser, models.PermissionsMixin)
...
location = models.ForeignKey(Location)
class Location(models.Model)
name = models.CharField(max_length=50, blank=True, null=True)
我编写了一个自定义用户表单,其中包括以下字段:
class MyCustomUserCreationForm(models.ModelForm)
...
location = forms.ModelChoiceField(Location.objects.all())
这一切似乎都正常工作,但是,在位置选择字段的右侧没有加号按钮。我希望能够在创建用户时添加位置,就像在Django tutorial中创建选项时可以添加投票一样。根据to this question,如果我没有更改模型的权限,我可能看不到绿色加号,但我以拥有所有权限的超级用户身份登录。知道我做错了什么吗?
最佳答案
您需要在模型表单中设置一个RelatedFieldWidgetWrapper
包装器:
RelatedFieldWidgetWrapper(可在django.contrib.admin.widgets中找到)
在管理页中用于包含外键功能
控件以添加新的相关记录。(英文:将绿色加号放在控件右侧。)
class MyCustomUserCreationForm(models.ModelForm)
...
location = forms.ModelChoiceField(queryset=Location.objects.all())
def __init__(self, *args, **kwargs):
super(MyCustomUserCreationForm, self).__init__(*args, **kwargs)
rel = ManyToOneRel(self.instance.location.model, 'id')
self.fields['location'].widget = RelatedFieldWidgetWrapper(self.fields['location'].widget, rel, self.admin_site)
我可能会在示例代码中犯错误,因此请参阅以下文章和示例:
RelatedFieldWidgetWrapper
More RelatedFieldWidgetWrapper – My Very Own Popup
Django admin - How can I add the green plus sign for Many-to-many Field in custom admin form
How can I manually use RelatedFieldWidgetWrapper around a custom widget?
Django: override RelatedFieldWidgetWrapper