【问题标题】:how to override django admin form Foreignkey based on request.user如何根据 request.user 覆盖 django 管理表单外键
【发布时间】:2012-08-26 00:51:58
【问题描述】:

admin.py

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

forms.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 个)

【问题讨论】:

  • 解释你遇到的错误是什么?

标签: python django django-1.3


【解决方案1】:

您不能在字段声明中使用 request.user 启动 store 字段。您可以尝试以下方法:

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)

如果你想在管理员中实现这一点,你可以试试this 为了在管理员中仅提供与登录用户相关的对象,提供了覆盖 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 方法。但是没有找到合适的方法来做。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-06-23
  • 1970-01-01
  • 2013-10-27
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多