【发布时间】:2021-09-22 00:19:16
【问题描述】:
我被困在使用 NestedTabularInline 过滤 Django-admin 部分中的 ModelChoiceField 中。尝试使用自定义ModelForm 为ModelChoiceField 提供queryset 以使其正确。
我想在选定的 plan 活动(它是父级)上过滤 plan 方法。见下图:
尝试解决此问题的 2 个问题:
-
print(filter_id)仅在第一个关系存储在数据库中时才生成输出,这是有道理的。当然,您也想过滤您的第一个PlanMethod。 - 我不知道如何正确创建查询集。
get(id=11)有效,但我需要以某种方式插入self.instance。filter_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