0

admin.py

class PromoAdmin(admin.modelAdmin)
      list_display = ( 'name', 'id', 'category', 'promo_type', 'store', 'brand', 'date_start' )
      form = SampleForm

フォーム.py

class SampleForm(forms.ModelForm):
class Meta:
     model = Promo

def __init__(self, request *args, **kwargs):
    super(PromoAdminForm, self).__init__(*args, **kwargs)
    self.fields["store"].queryset = Store.objects.filter(onwer=request.user)

リクエストでエラーが発生しました

Django バージョン: 1.3.1 例外タイプ: TypeError 例外値:
init () は少なくとも 2 つの引数を取ります (1 つ指定)

4

1 に答える 1

1

フィールド宣言でrequest.userを使用してストアフィールドを開始することはできません。次のことを試すことができます。

class MyAwesomeForm(forms.ModelForm):
    store = forms.ModelChoiceField(Store.objects)
    class Meta:
       model = Promo

def __init__(self, user, *args, **kwargs):
    super(MyAwesomeForm, self).__init__(*args, **kwargs)
    self.fields['store'].queryset = Store.objects.filter(owner=user)

フォームをインスタンス化するときに、request.userオブジェクトを渡すことができます。

myform = MyAwesomeForm(request.user)

管理者でこれを実現したい場合は、これを試しみてください。管理者 でログインしているユーザーに関連するオブジェクトのみを提供するために、ModelAdmin.queryset関数を上書きする可能性があります。

class MyModelAdmin(admin.ModelAdmin):
    form = MyAwesomeAdminForm()
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(store__owner=request.user)

class MyAwesomeAdminForm(forms.ModelForm):
    class Meta:
       model = Promo

store__ownerは、プロモーションモデルに外部キーフィールドが次のように格納されている場合にのみ機能することに注意してください。

class Promo(models.Model):
    store = models.ForeignKey(Store)

class Store(models.Model):
    owner = models.ForeignKey(User)

どういうわけか、フォームのinitメソッドにリクエストを渡すことも可能であると思います。しかし、それを行うための適切なアプローチは見つかりませんでした。

于 2012-08-31T08:26:26.427 に答える