【问题标题】:Apply filtering on ModelChoiceField in Django-admin inline section在 Django-admin 内联部分中对 ModelChoiceField 应用过滤
【发布时间】:2021-09-22 00:19:16
【问题描述】:

我被困在使用 NestedTabularInline 过滤 Django-admin 部分中的 ModelChoiceField 中。尝试使用自定义ModelFormModelChoiceField 提供queryset 以使其正确。 我想在选定的 plan 活动(它是父级)上过滤 plan 方法。见下图:

尝试解决此问题的 2 个问题:

  1. print(filter_id) 仅在第一个关系存储在数据库中时才生成输出,这是有道理的。当然,您也想过滤您的第一个 PlanMethod
  2. 我不知道如何正确创建查询集。 get(id=11) 有效,但我需要以某种方式插入self.instancefilter_id 的输出如下所示:

这里需要一些建议。

模型.py:

class Activity(models.Model):
    activity = models.CharField(max_length=30, default=0)
    def __str__(self):
        return self.activity

class Method(models.Model):
    method = models.CharField(max_length=30)
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE, null=True)
    def __str__(self):
        return self.method

class PlanActivity(models.Model):
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE, null=True)
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE, null=True)
    position  = models.PositiveIntegerField(default=0, blank=False, null=False)
    class Meta:
        ordering = ('position', )

class PlanMethod(models.Model):
    planactivity = models.ForeignKey(PlanActivity, on_delete=models.CASCADE, null=True)
    method = models.ForeignKey(Method, on_delete=models.CASCADE, null=True)
    position  = models.PositiveIntegerField(default=0, blank=False, null=False)
    class Meta:
        ordering = ('position', )

admin.py:

class PlanMethodAdminForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(PlanMethodAdminForm, self).__init__(*args, **kwargs)
        filter_id = self.instance.planactivity_id
        print(filter_id)
        self.fields['method'].queryset = Method.objects.filter(
            activity_id=PlanActivity.objects.get(id=11).activity_id
            )

class PlanMethodAdminInline(SortableHiddenMixin, NestedTabularInline):
    model = PlanMethod
    sortable_field_name = "position"
    extra = 0
    form = PlanMethodAdminForm
        
class PlanActivityAdminInline(SortableHiddenMixin, NestedTabularInline):
    model = PlanActivity
    sortable_field_name = "position"
    extra = 0
    inlines = [PlanMethodAdminInline]

【问题讨论】:

    标签: python django django-forms django-admin


    【解决方案1】:

    我会试试这个:: link

    from django.contrib import admin
    from app.models import Method
    from django import forms
    
    class PlanMethodAdminForm(forms.ModelForm):
      def __init__(self, *args, **kwargs):
        super(PlanMethodAdminForm, self).__init__(*args, **kwargs)
        
       class Meta:
        model = Method
        fields = '__all__'
    
    class PlanMethodAdminInline(admin.ModelAdmin):
    sortable_field_name = "position"
    extra = 0
    form = PlanMethodAdminForm
    list_filter = ['method']
    search_fields = ['method']
    admin.site.register(Method, PlanMethodAdminInline)
    

    希望对你有帮助,谢谢

    【讨论】:

    • 嗨,约翰,非常感谢您的回复。虽然这不是正确的答案。 list_filter 和 search_field 方法位于管理列表视图页面中(如果我将 NestedTabularInline 更改为 ModelAdmin,您是对的)。但是因为我使用的是 NestedTabularInline,你实际上永远不会遇到这个列表视图。我希望在 ModelChoiceField 中专门进行过滤。
    猜你喜欢
    • 2011-01-07
    • 2014-01-31
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-07-04
    • 2012-04-13
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多