1

ForeignKeyフィールドのドロップダウンをラジオボタン付きの画像のリストに置き換えるために使用されるカスタムウィジェットがあります。私のrender方法では、を使用して通常のビューで行うように、現在のユーザー (現在ログインしているユーザー) にアクセスする必要がありますrequest.user

メソッドでFormsユーザーオブジェクトをポップする必要があるため、これを行うための多くのソリューションを読みました。**kwargs__init__

**kwargsただし、ウィジェットにはメソッドがありません__init__:

def __init__(self, attrs=None):
    if attrs is not None:
        self.attrs = attrs.copy()
    else:
        self.attrs = {}

Widgetサブクラス内で現在のユーザーにアクセスするにはどうすればよいですか?

4

1 に答える 1

1

formfield_overridesDjangoソースを読んで解決策を見つけました:カスタム管理者で設定するときにユーザーオブジェクトを渡します。

と の 2 つのモデルがNewsありImageます。Image名前フィールドとImageField. Newsモデルには、ForeignKey画像を指す whichが含まれています。

class News(models.Model):
    ... bunch of news related fields
    image = models.ForeignKey(Image)

次に、admin.pyニュース用のカスタム管理クラスがあります。

class NewsAdmin(admin.ModelAdmin):
    model = News

    def get_form(self, request, obj=None, **kwargs):
        self.formfield_overrides = {
            models.ForeignKey : {'widget' : SelectForeign(user = request.user)}
        }

        return super(NewsAdmin, self).get_form(request, obj, **kwargs)

次にwidget.py、カスタムウィジェットクラスがあります:

class SelectForeign(widgets.Widget): current_user = None

def __init__(self, attrs=None, choices=(), user = None):
    self.current_user = None
    super(SelectForegin, self).__init__(attrs, choices)

これで、ウィジェットには現在ログインしているユーザーが含まれるようになりました。それはかなりイモではありませんが、うまくいきます。

注:これにより、モデルForeignKey内のすべてのフィールド が置き換えられます。Newsこれを修正するには、カスタムForeignKeyサブクラスを使用して、そのサブクラスのみをオーバーライドできるようにする必要があります。

誰かがよりクリーンな解決策を持っている場合は、共有してください。受け入れます。

于 2013-03-29T17:37:30.297 に答える