Как получить доступ к родительскому объекту из админки tabularinline в админке Django
Мне нужно получить доступ к родительскому объекту элемента, чтобы иметь возможность фильтровать выпадающие поля Fk внутри инлайн-объекта на основе того, что он является родителем.
вот мой код :
models.py
class Match(models.Model):
date_time = models.DateTimeField()
home_team = models.ForeignKey('teams.Team',related_name="home_team_team",on_delete=models.PROTECT)
away_team = models.ForeignKey('teams.Team',related_name="away_team_team",on_delete=models.PROTECT)
league = models.ForeignKey(League,on_delete=models.CASCADE,null=True)
class Goal(models.Model):
match = models.ForeignKey(Match,on_delete=models.CASCADE)
date_time = models.DateTimeField()
team = models.ForeignKey("teams.Team",on_delete=models.PROTECT,null=True,blank=True)
player = models.ForeignKey('players.PlayerProfile',related_name="goal_maker",on_delete=models.PROTECT,null=True,blank=True)
assistant = models.ForeignKey('players.PlayerProfile',related_name="goal_assist",on_delete=models.PROTECT,null=True,blank=True)
admin.py
#this is my inline class
class GoalInline(nested_admin.NestedTabularInline):
model = Goal
fields = ['date_time','team','player','assistant']
extra = 1
show_change_link = True
def formfield_for_foreignkey(self, db_field, request, **kwargs):
print(f"data {self.model}")
if db_field.name == "team":
kwargs["queryset"] = Team.objects.filter() #i need to perform filtering here
return super().formfield_for_foreignkey(db_field, request, **kwargs)
#my parent class
@admin.register(Match)
class MatchAdmin(nested_admin.NestedModelAdmin):
# form = LeagueForm
readonly_fields = ['date_time','home_team','away_team','league']
list_display = ["league","home_team","away_team",]
search_fields=["home_team","away_team","league"]
list_filter=['league','date_time',"home_team","away_team"]
inlines=[GoalInline]
def get_inlines(self, request, obj=None):
if obj:
return [GoalInline]
else:
return []
Находит решения, получая данные о родителях из пути kwargs
class GoalInline(nested_admin.NestedTabularInline):
model = Goal
fields = ['date_time', 'team', 'player', 'assistant']
extra = 1
show_change_link = True
def get_parent_object_from_request(self, request):
"""
Returns the parent object from the request or None.
Note that this only works for Inlines, because the `parent_model`
is not available in the regular admin.ModelAdmin as an attribute.
"""
resolved = resolve(request.path_info)
the_parent_object_id = resolved.kwargs['object_id']
the_object = self.parent_model.objects.get(id=the_parent_object_id)
return the_object
Тогда я могу использовать его внутри фильтра:
def formfield_for_foreignkey(self, db_field, request, **kwargs):
parent = self.get_parent_object_from_request(request)
home_team_object = parent.home_team
away_team_object = parent.away_team
if db_field.name == "team":
kwargs["queryset"] = Team.objects.filter(Q(away_team_team=parent) | Q(home_team_team=parent))
if db_field.name == "player":
parent = self.get_parent_object_from_request(request)
print(parent)
kwargs["queryset"] = PlayerProfile.objects.filter(Q(team=away_team_object) | Q(team=away_team_object))
if db_field.name == "assistant":
parent = self.get_parent_object_from_request(request)
print(parent)
kwargs["queryset"] = PlayerProfile.objects.filter(Q(team=away_team_object) | Q(team=home_team_object))
return super().formfield_for_foreignkey(db_field, request, **kwargs)