如何在Django的GenericStackedInline Admin中访问请求对象

普罗米修斯

在Django 1.9 (Python 3.4)中使用GenericStackedInline我想将模型保存到Django Admin中之前访问请求对象

当使用时,MediaItemAdmin我可以在obj.save()运行之前拦截保存功能,如以下示例所示:

管理员

class StuffAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # Do some stuff here like obj.user = request.user before saving.
        obj.save()

但是,使用时无法使用相同的行为或“挂钩” GenericStackedInline似乎直接调用模型保存方法:

管理员

class StuffAdmin(GenericStackedInline):
    model = StuffModel

    def save_model(self, request, obj, form, change):
        print("I'm never run :(")
        obj.save()

据我了解,GenericStackedInline继承自a,form所以我也尝试过使用表格并将其覆盖,如本例所示:

管理员

class StuffAdmin(GenericStackedInline):
    model = StuffModel
    form = StuffForm

class StuffForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(StuffForm, self).__init__(*args, **kwargs)

    def save_model(self, request, obj, form, change):
        print("Still not run!(")
        obj.save()

    def save_form(self, request, obj, form, change):
        print("Work already!")
        obj.save()

我已经搜索了stackoverflow,但是大多数都没有得到答案,就像在这里看到的在django admin内联模型中访问请求对象init一样self.request = kwargs.pop('request')或者说使用do做类似的事情request从未在这里传递,对吧?

无论如何,在调用模型save()之前如何调用请求对象并更新实例的任何想法?

安托万·平沙德(Antoine Pinsard)

保存“内联”的方法是的一部分ModelAdmin,而不是InlineModelAdmin

class BarInline(GenericStackedInline):
    model = Bar

class FooModelAdmin(ModelAdmin):
    model = Foo
    inlines = [BarInline]

    def save_formset(self, request, form, formset, change):
        """
        `form` is the base Foo form
        `formset` is the ("Bar") formset to save
        `change` is True if you are editing an existing Foo,
                    False if you are creating a new Foo
        """
        if formset_matches_your_inline_or_some_requirement(formset):
            do_something_with(request)
        super().save_formset(request, form, formset, change)

如果您要检查表单集是否为BarInline的表单集,则可以执行以下操作:

class BarInline(GenericStackedInline):
    model = Bar

    def get_formset(self, *args, **kwargs):
        formset = super().get_formset(*args, **kwargs)
        formset.i_come_from_bar_inline = True
        return formset


class FooModelAdmin(ModelAdmin):
    model = Foo
    inlines = [BarInline]

    def save_formset(self, request, form, formset, change):
        if getattr(formset, 'i_come_from_bar_inline', False):
            do_something_with(request)
        super().save_formset(request, form, formset, change)

甚至更好,使其通用:

class BarInline(GenericStackedInline):
    model = Bar

    def pre_save_formset(self, request, form, model_admin, change):
       """Do something here with `request`."""

class FooModelAdmin(ModelAdmin):
    model = Foo
    inlines = [BarInline]

    def save_formset(self, request, form, formset, change):
        if hasattr(formset, 'pre_save_formset'):
            formset.pre_save_formset(request, form, self, change)
        super().save_formset(request, form, formset, change)
        if hasattr(formset, 'post_save_formset'):
            formset.post_save_formset(request, form, self, change)

如果您需要在保存每个表单之前而不是在每个表单集之前对请求进行某些操作,则必须使用自己的Form,并且FormSet可以通过表单集将请求传播到表单:

from django.forms import ModelForm
from django.forms.models import BaseInlineFormSet

class BarForm(ModelForm):
    model = Bar

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

    def save(self, commit=True):
        print(self.request)
        print(self.instance)
        obj = super().save(False)  # Get object but don't save it
        do_something_with(self.request, obj)
        if commit:
            obj.save()
            self.save_m2m()
        return obj

class BarFormSet(BaseInlineFormSet):

    @property
    def request(self):
        return self._request

    @request.setter
    def request(self, request):
        self._request = request
        for form in self.forms:
            form.request = request

class BarInline(GenericStackedInline):
    codel = Bar
    form = BarForm
    formset = BarFormSet


class FooModelAdmin(ModelAdmin):
    inlines = [BarInline]

    def _create_formsets(self, request, obj, change):
        formsets, inline_instances = super()._create_formsets(request, obj, change)
        for formset in formsets:
            formset.request = request
        return formsets, inline_instances

根据您的用例,save方法也可能看起来像这样:

class BarForm(ModelForm):
    model = Bar

    def save(self, commit=True):
        do_something_with(self.request, self.instance)
        return super().save(commit)  # Get object but don't save it

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Django的GenericStackedInline Admin中访问请求对象

来自分类Dev

如何在Django模型admin change_form.html中访问请求对象?

来自分类Dev

如何在 fetch then/response 函数中访问请求对象

来自分类Dev

在Django中,如何在装饰器函数的请求对象中设置值并从装饰函数中的请求对象访问它

来自分类Dev

使用python 3访问Django POST请求中的嵌套对象

来自分类Dev

在Django urls.py中访问请求对象

来自分类Dev

使用python 3访问Django POST请求中的嵌套对象

来自分类Dev

如何在sails.js生命周期回调中访问请求对象?

来自分类Dev

如何在AJAX请求中访问JSON对象的子数组键

来自分类Dev

如何在Hibernate中每2个HTTP请求访问一个实体对象?

来自分类Dev

如何在Appengine中访问当前请求?

来自分类Dev

如何在 EL 中访问请求参数

来自分类Dev

如何使用 Group By 和 Join 访问对象 User (django admin)?

来自分类Dev

如何在django modelform中访问admin中的request.user

来自分类Dev

如何在JavaScript中访问在AJAX请求中作为响应发送的自定义Java对象?

来自分类Dev

如何在Slim中访问POST请求的JSON请求正文?

来自分类Dev

如何在 Django Admin 中显示关系

来自分类Dev

如何在javascript中的对象内访问对象中的对象?

来自分类Dev

如何在实现 HandlerInterceptor 的类中创建对象以从任何地方访问它以获取该请求

来自分类Dev

如何在Django中访问与模型相关的对象的所有子对象?

来自分类Dev

如何在 django urls 中传递请求

来自分类Dev

如何使用Spring Websocket实现访问@MessageMapping方法中的请求对象

来自分类Dev

在django admin中,您如何访问子模型中的功能?

来自分类Dev

如何在angularjs中访问对象数组

来自分类Dev

如何在processing()对象中访问数据

来自分类Dev

如何在PostMan中访问Request对象

来自分类Dev

如何在BackgroundWorker中访问COM对象?

来自分类Dev

如何在PHP对象中访问信息

来自分类Dev

如何在Javascript中访问JSON对象?

Related 相关文章

  1. 1

    如何在Django的GenericStackedInline Admin中访问请求对象

  2. 2

    如何在Django模型admin change_form.html中访问请求对象?

  3. 3

    如何在 fetch then/response 函数中访问请求对象

  4. 4

    在Django中,如何在装饰器函数的请求对象中设置值并从装饰函数中的请求对象访问它

  5. 5

    使用python 3访问Django POST请求中的嵌套对象

  6. 6

    在Django urls.py中访问请求对象

  7. 7

    使用python 3访问Django POST请求中的嵌套对象

  8. 8

    如何在sails.js生命周期回调中访问请求对象?

  9. 9

    如何在AJAX请求中访问JSON对象的子数组键

  10. 10

    如何在Hibernate中每2个HTTP请求访问一个实体对象?

  11. 11

    如何在Appengine中访问当前请求?

  12. 12

    如何在 EL 中访问请求参数

  13. 13

    如何使用 Group By 和 Join 访问对象 User (django admin)?

  14. 14

    如何在django modelform中访问admin中的request.user

  15. 15

    如何在JavaScript中访问在AJAX请求中作为响应发送的自定义Java对象?

  16. 16

    如何在Slim中访问POST请求的JSON请求正文?

  17. 17

    如何在 Django Admin 中显示关系

  18. 18

    如何在javascript中的对象内访问对象中的对象?

  19. 19

    如何在实现 HandlerInterceptor 的类中创建对象以从任何地方访问它以获取该请求

  20. 20

    如何在Django中访问与模型相关的对象的所有子对象?

  21. 21

    如何在 django urls 中传递请求

  22. 22

    如何使用Spring Websocket实现访问@MessageMapping方法中的请求对象

  23. 23

    在django admin中,您如何访问子模型中的功能?

  24. 24

    如何在angularjs中访问对象数组

  25. 25

    如何在processing()对象中访问数据

  26. 26

    如何在PostMan中访问Request对象

  27. 27

    如何在BackgroundWorker中访问COM对象?

  28. 28

    如何在PHP对象中访问信息

  29. 29

    如何在Javascript中访问JSON对象?

热门标签

归档