django - 将请求传递给 Django Admin 中的内联表单?

标签 django forms admin

我正在尝试从 Django Admin 中的请求中获取用户。我需要的是在内联表单的 clean() 中访问请求的用户方法。我已经用普通 ModelForm 完成了一个类似于下面描述的过程。 (即不是内联的),我成功了。但是,对于内联,我遇到了很多问题。
我有:

class SaleFormset(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super(SaleFormset, self).__init__(*args, **kwargs)

    def _construct_form(self, i, **kwargs):
        kwargs['request'] = self.request
        super(SaleFormset, self)._construct_form(i, **kwargs)


class SaleProductItemInlineForm(ModelForm):
    """
    Custom form for the Sale Product Item Inline used by the
    Sale Admin form.
    """

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super(SaleProductItemInlineForm, self).__init__(*args, **kwargs)

    class Meta:
        model = SaleProductItem
        fields = "__all__"  

在 admin.py 中,我有:
class SaleProductItemInline(admin.TabularInline):
    """
    Tabular inline for a SaleProductItem used in the Sale Admin.
    """
    model = models.SaleProductItem
    form = SaleProductItemInlineForm
    formset = SaleFormset

    def get_formset(self, request, obj=None, **kwargs):
        formset_class = super(SaleProductItemInline, self).get_formset(request, obj, **kwargs)

        class Subset(formset_class):
            def __new__(cls, *args, **kwargs):
                kwargs['request'] = request
                return formset_class(*args, **kwargs)

        return Subset

但是,我收到一条错误消息 'NoneType' object has no attribute 'media'因为这个部分:
@property
def media(self):
    # All the forms on a FormSet are the same, so you only need to
    # interrogate the first form for media.
    if self.forms:
        return self.forms[0].media

最佳答案

与此类似的方法对我有用:

def SaleProductItemInlineFormFactory(request):
    class SaleProductItemInlineForm(ModelForm):
        def __init__(self, *args, **kwargs):
            # here finally you can do something with your request
            super(SaleProductItemInlineForm, self).__init__(*args, **kwargs)

        class Meta:
            model = SaleProductItem
            fields = "__all__"
    return SaleProductItemInlineForm

def SaleProductItemInlineFactory(request):
    class SaleProductItemInline(admin.TabularInline):
        model = models.SaleProductItem
        form = SaleProductItemInlineFormFactory(request)

    return SaleProductItemInline

class SaleAdmin(admin.ModelAdmin):
    inlines = ()

    # such way we send request to main form
    def get_form(self, request, obj=None, **kwargs):
        form = super(SaleAdmin, self).get_form(request, obj=obj, **kwargs)
        form.request = request
        return form

    # we define inlines with factory to create Inline class with request inside
    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inlines = (SaleProductItemInlineFactory(request), )
        return super(SaleAdmin, self).change_view(request, object_id)

    # we define inlines with factory to create Inline class with request inside
    def add_view(self, request, form_url='', extra_context=None):
        self.inlines = (SaleProductItemInlineFactory(request), )
        return super(SaleAdmin, self).add_view(request)

关于django - 将请求传递给 Django Admin 中的内联表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050584/

相关文章:

javascript - 为什么我在使用 javascript 提交表单而不是加载页面时无法获取发布数据?

C++:以管理员身份运行程序

javascript - 未定义元素

ruby-on-rails - 在性别选择中使用 Rails 的 Tinyint 和 select 标签

python - 在 django 生产中记录所有 sql 查询是个好主意吗?

php - Jquery 返回 Object 对象,前两个字段按预期返回

magento - Magento更改管理员中选择字段的默认值

c# - 使用管理权限启动我的 C# 应用程序

python - 使用 python 3 在 Windows 10 上运行服务器时出现 django 404 错误

python - 执行 Django manage.py syncdb 时出错