#python #django #django-filter
Вопрос:
Мой сайт просто работает так: у каждого менеджера может быть несколько подчиненных, у этих подчиненных могут быть некоторые Агенты (таким образом, Агенты косвенно связаны с Менеджером, см. Модели.py, чтобы лучше понять отношения между ними). Я хочу показать на странице профиля менеджера (см. views.py) все членские карточки, созданные его/ее связанными агентами. Я пытаюсь реализовать фильтр для поиска, например, карточек, созданных конкретным агентом, я могу это сделать, но я хотел бы показать в раскрывающемся списке только Агентов, связанных с Менеджером, в раскрывающемся списке теперь отображаются все агенты в базе данных
models.py
class StandardProfile(models.Model):
name = models.CharField(max_length=200, null=True)
surname = models.CharField(max_length=200, null=True)
phone_number = models.CharField(max_length=200, null=True)
class Meta:
abstract = True
class Manager(StandardProfile):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
class SubManager(StandardProfile):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
manager = models.ForeignKey(Capo, null=True, on_delete = models.SET_NULL)
class Agent(StandardProfile):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
manager = models.ForeignKey(Manager, null=True, on_delete = models.SET_NULL)
subManager = models.ForeignKey(SubManager, null=True, blank=True, on_delete = models.SET_NULL)
class MembershipCard(models.Model):
agent = models.ForeignKey(Agent, null=True,blank=True, on_delete = models.SET_NULL)
client = models.ForeignKey(Client, null=True,blank=True, on_delete = models.SET_NULL)
creation_date = models.DateTimeField(auto_now_add=True, null=True)
activation_date = models.DateTimeField(null=True,blank=True)
expiration_date = models.DateTimeField(null=True,blank=True)
views.py
@login_required(login_url='login')
def profilePage(request, pk): #www.mysite.com/profilePage/<pk>
user = User.objects.get(id=pk) #getting the user from <pk>
cards = MembershipCard.objects.filter(agent__manager=user.manager)
myFilter = MembershipCardFilter(request.GET,queryset=cards,user=user)
cards = myFilter.qs
#page_obj is used for Pagination, and contains the cards, i removed this part of code for better readability, can add it if needed
context = {'page_obj': page_obj,"user": user,"myFilter":myFilter}
return render(request, 'polls/profilePage.html',context)
filters.py
class MembershipCardFilter(django_filters.FilterSet):
class Meta:
model = MembershipCard
fields = ['agent','agent__subManager']
exclude = ['creation_date']
Читая ответы на подобные вопросы, я думаю, что мне нужно изменить __init__
метод в классе CardFilter, я попытался адаптировать некоторые ответы к своему случаю, но по некоторым причинам это не сработало . Любой ответ/комментарий приветствуется!
PS: Я не знаю, понятно ли название, не стесняйтесь предлагать лучшее
Ответ №1:
Вы можете попробовать ввести раскрывающийся список агента во время инициализации, например (не проверено!):
class MembershipCardFilter(django_filters.FilterSet):
agent= django_filters.ModelChoiceFilter(
queryset=Agent.objects.none(),
)
class Meta:
model = MembershipCard
fields = ['agent','agent__subManager']
exclude = ['creation_date']
def __init__(self, *args, **kwargs):
user = kwargs.get("user")
agents = Agent.objects.filter(manager__user=user)
super().__init__(*args, **kwargs)
self.filters["agent"].queryset = agents
Комментарии:
1. Я думаю, что мы ближе к решению, в любом случае проблема в том, что
kwargs.get("user")
оно не возвращает ничего, и если я попытаюсь создать такой фильтрmyFilter = MembershipCardFilter(request.GET,queryset=cards, user=user)
, я получу эту ошибку__init__() got an unexpected keyword argument 'user'
. Есть идеи, как это исправить?2. Я использовал
user = kwargs.get("user")
, потому что вы уже передали его в MembershipCardFilter. Используйтеuser = kwargs.pop("user")
вместо этого.3. Я поменялся
get
сpop
помощью, и теперь это работает, ваш aswer очень чистый. Теперь я также лучше понимаю, как работают фильтры, спасибо!