RelatedFieldWidgetWrapper

RelatedFieldWidgetWrapper

我正在制作一个带有自定义用户的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

10-02 10:13