姜戈。根据父 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 中删除了过滤器,因为它们不再需要。
我的 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 中删除了过滤器,因为它们不再需要。