0

タイトルのように、フォームにレンダリングされるフィールドを交換したいと思います。たとえば、次のモデルがあります。

models.py
class Project(models.Model):
    name = models.TextField(max_length=200)
    finished = models.BoolenField(default=False)

admin.py
class ProjectAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            #here change the name field form TextField 
            #to a disabled TextField or to other Field defined by me
            self.form['name']['widget] = MySuperDuperWidgetField() #or smth like that

出来ますか?

4

2 に答える 2

1

ModelAdminサブクラスのformfield_for_dbfieldメソッドをオーバーライドする必要があります。その中で、リクエスト、現在のユーザー、およびオブジェクトインスタンスを調べて、使用する正しいフォームフィールドを決定できます(必要なカスタムウィジェットを使用して)

(formfield_for_dbfieldは文書化されていないため、自己責任で進めてください:))問題のフィールドが外部キー、m2m、または選択フィールドであることがわかっている場合は、それらをオーバーライドするための文書化されたメソッドがあります。

于 2012-01-20T16:07:13.767 に答える
1

はい、それは可能ですが、あなたがそれを持っているようではありません:

class ProjectAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        ModelForm = super(ProjectAdmin, self).get_form(request, obj=None, **kwargs)
        class PermissionedModelForm(ModelForm):
            def __init__(self, *args, **kwargs):
                super(PermissionedModelForm, self).__init__(*args, **kwargs)

                if request.user.is_superuser:
                    self.fields['name'].widget = MySuperDuperWidgetField()

        return PermissionedModelForm

編集

実際には、フィールドのウィジェットを変更するような単純なものについては、@ IanClellandの答えの方が適切ですが、それよりも複雑なことを行う必要がある場合は、このアプローチが最適です。

于 2012-01-20T16:08:59.933 に答える