姜戈。根据父 pk 过滤与数据内联的新条目

Django. Filter new entry inline with data based on parent pk

我的 Django 项目取得了良好的进展,但这个可用性问题一直存在。我希望能够根据父 ID 过滤内联表单中的下拉菜单。例如。

主题模型属于课程。

class Theme (models.Model):
    id = models.AutoField(primary_key=True) # AutoField?
    code = models.CharField(max_length=5)
    course = models.ForeignKey(Course)
    theme_text = models.CharField(max_length=50)
    description = models.TextField(blank=True, max_length=1000)
    zorder = models.IntegerField()

指标模型也属于课程

class Indicator (models.Model):
    id = models.AutoField(primary_key=True) # AutoField?
    code = models.CharField(max_length=10)
    indicator_text = models.TextField(blank=True)
    explained = models.TextField("Explained",blank=True)
    course = models.ForeignKey('curriculum.Course')
    theme = models.ForeignKey(Theme)        
    strand = models.ForeignKey(Strand,blank=True,null=True)
    level = models.ForeignKey(Level,blank=True,null=True)
    concept = models.ManyToManyField(Concept,blank=True)

管理主题表单调用 Indicator Inline

class ThemeAdmin(admin.ModelAdmin):
    list_display = ['code', 'theme_text','description','course']
    list_filter = ['course']
    inlines = [InlineIndicator]

这又会调用 IndicatorInlineForm

class InlineIndicator(admin.TabularInline):
    form = IndicatorInlineForm
    model = Indicator
    extra = 0

IndicatorInlineForm 将数据过滤到某些字段(课程、主题、链和概念)

class IndicatorInlineForm (forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(IndicatorInlineForm, self).__init__(*args, **kwargs)
        if self.instance.pk is not None:
            self.fields['course'].queryset = Course.objects.filter(id=self.instance.course)
            self.fields['theme'].queryset = Theme.objects.filter(course=self.instance.course)
            self.fields['strand'].queryset = Strand.objects.filter(course=self.instance.course)
            self.fields['concept'].queryset = Concept.objects.filter(course=self.instance.course)
        else:
            self.fields['course'].queryset = Course.objects.filter(id=4)
            self.fields['theme'].queryset = Theme.objects.filter(course=4)
            self.fields['strand'].queryset = Strand.objects.filter(course=4)
            self.fields['concept'].queryset = Concept.objects.filter(course=4)

这适用于已在指标记录中设置课程 ID 的现有记录,但它还不适用于新的指标记录。

我希望新的指标记录使用课程 course.id 根据主题筛选可用选项。

我不确定我是否看到建议的副本如何解决这个问题,因为它是针对现有记录的,或者我可能错了,在这种情况下请帮助我!

我一直在阅读有关 formsets 的内容,但感觉它可能过于复杂了。我也对它与我已经拥有的东西的位置感到有些困惑。

感谢期待您的帮助(以及迄今为止的所有帮助)。

克里斯

我能够使用 formfield-for-foreignkey-and-inline-admin 来回答这个问题,尽管它似乎不适用于 manytomany 字段的概念。

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
    changelist_filters = request.GET['_changelist_filters'].rsplit("=",1)
    course_id = int(changelist_filters[1])

    if db_field.name == 'course':
        kwargs['queryset'] = Course.objects.filter(pk = course_id)
    elif db_field.name == 'strand':
            kwargs['queryset'] = Strand.objects.filter(course = course_id)
    elif db_field.name == 'concept':
            kwargs['queryset'] = Concept.objects.filter(course = course_id)

    return super(InlineIndicator, self).formfield_for_foreignkey(db_field, request, **kwargs)   

我从 IndicatorInlineForm 中删除了过滤器,因为它们不再需要。