【问题标题】:Access inline object in InlineModelAdmin form以 InlineModelAdmin 形式访问内联对象
【发布时间】:2015-02-05 14:28:11
【问题描述】:

我有这样一个问题:我想限制内联模型管理中的外键选择,但我想根据这个内联对象中指定的一些值来执行此操作。

如何在 InlineModelAdmin 方法中访问内联对象(不是父对象)(特别是在 formfield_for_foreignkey(self, db_field, request, **kwargs) 中)?

【问题讨论】:

    标签: django django-admin inline-formset


    【解决方案1】:

    无法访问任何 InlineModelAdmin 方法中的内联对象。

    唯一的方法是使用一个自定义的模型表单,它在初始化时接收instance。注意extra 形成新的内联对象接收和“空”instance (pk=None)。

    from django.forms import ModelForm
    from django.contrib.admin import ModelAdmin, TabularInline
    
    class QuestionForm(ModelForm):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            if self.instance.pk:
                # do what you want with inline object instance
    
        class Meta:
            model = Question
            fields = "__all__"
    
    class QuestionInline(TabularInline):
        model = Question
        form = QuestionForm
    
    class CategoryAdmin(ModelAdmin):
        model = Category
        inlines = [QuestionInline]
    

    【讨论】:

      【解决方案2】:

      这应该适合你。用您的正确值更改“YourModelAdmin”、“target_field”、“your_custom_condition”和“...”。

      def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
          field = super(YourModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
          if db_field.name == 'target_field':
              if request and your_custom_condition:
                  field.queryset = field.queryset.filter(...)
          return field
      

      【讨论】:

      • 我的问题更进一步:在formfield_for_foreigkey 和适当的db_field 内部,我想根据当前内联模型对象过滤可能的选项。那么如何访问这个对象呢?
      • @andrzejdoro 你能弄清楚吗?我有类似的问题。你的解决方案可能对我有帮助。谢谢。
      • 不幸的是,我没有找到解决方案。恐怕无法访问此值。但如果你弄明白了,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多