考虑一款人们可以参加比赛的应用。
我准备好了Contest
和ContestProblem
模型。我想为比赛提供以下功能:
- 一场比赛可能有很多问题
- 一道题不能出现在多场比赛中
在我的 models.py
中,我有:
class ProblemsInContest(CreateUpdateDateModel):
contest = models.ForeignKey(Contest)
problem = models.ForeignKey(ContestProblem)
class Meta:
verbose_name = "Problem in Contest"
verbose_name_plural = "Problems in Contest"
def __str__(self):
return "{problem}".format(problem=self.problem)
在我的 admin.py 中,我有:
class ContestProblemInline(admin.TabularInline):
model = ProblemsInContest
extra = 1
class ContestAdmin(admin.ModelAdmin):
inlines = [
ContestProblemInline,
]
我正在使用 Django Admin 向比赛中添加问题。问题在于,在“问题”下拉列表中,它向我显示了所有 ContestProblem
,但我想将其限制为仅显示那些未出现在任何其他比赛中的 ContestProblem
。
任何能达到预期结果的提示、建议或引用将不胜感激。
最佳答案
class ContestProblemInline(admin.TabularInline):
model = ProblemsInContest
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
field = super(RoomInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
if db_field.name == 'your_field_name':
if request._obj_ is not None:
field.queryset = field.queryset.filter(your_field_name = request._obj_)
else:
field.queryset = field.queryset.none()
return field
class ContestAdmin(admin.ModelAdmin):
inlines = (ContestProblemInline,)
def get_form(self, request, obj=None, **kwargs):
# just save obj reference for future processing in Inline
request._obj_ = obj
return super(ContestAdmin, self).get_form(request, obj, **kwargs)
关于python - 在 Django Admin 中限制/过滤外键选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401465/