覆盖 Forms.modelAdmin 中的 django 表单

Overriding django form in Forms.modelAdmin

我想覆盖表单中的字段时遇到问题

class 如下所示

   class UserCreationForm(forms.ModelForm):
class Meta:
    model = User
    fields = ['password', 'services', 'project', 'email', 'name', 'first_name', 'role']

我想用另一个值修改字段 'Services'。 为此,我使用了 get_form 函数,如下所示:

class UserAdmin(admin.ModelAdmin):
      exclude = ('uuid',)
      search_fields = ('email', "project")
      list_display = ("email", "project", "nb_connexion")
      form = UserCreationForm


    def get_form(self, request, obj=None, **kwargs):
        if obj != None:
            print(obj.name)
            print(request)
            form = super(UserAdmin, self).get_form(request, obj=obj, **kwargs)
            form.base_fields['services'].initial = Service.objects.filter(projects=obj.project)

        return form

但是我仍然得到所有服务的相同结果,而我只对获得一个 project.Any 帮助的服务感兴趣。

谢谢

您目前正在尝试设置 initial,这是所选的初始值。如果你想限制选择,你想改写 queryset

您可以在 __init__ 方法中更改表单的字段:

class UserCreationForm(forms.ModelForm):
    class Meta:
    model = User
    fields = ['password', 'services', 'project', 'email', 'name', 'first_name', 'role']

    def __init__(self, *args, **kwargs):
        super(UserCreationForm, self).__init__(*args, **kwargs)
        if self.instance.pk:
            self.fields['services'].queryset = Service.objects.filter(projects=self.instance.project)

您的 UserAdmin class 已经使用了 form = UserCreationForm,因此您只需删除 get_form 方法即可。

class UserAdmin(admin.ModelAdmin):
    ...
    form = UserCreationForm
    ...