I am building a BlogApp and I am trying to show all the users which set their Countries
similar to request.user
.
For Example : If
user_1
isrequest.user
and selected state choiceVictoria
and countryAustralia
and thenuser_2
registered and set the same stateVictoria
and countryAustralia
.
So i want to show all the users that have set their Country
and state
same to request.user
BUT When i access these types of users then It is just showing all users of same country
BUT it is not showing of same state
.
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,default='',unique=True)
country = models.CharField(max_length=30,null=True,blank=True)
state = models.CharField(max_length=30,null=True,blank=True)
views.py
def show_user(request.user):
show = Profile.objects.filter(country=request.user.profile)
show_state = Profile.objects.filter(state=request.user.profile)
context = {'show':show,'show_state':show_state}
return render(request, 'show_user.html', context)
When i try to access {{ show }} in template then it shows two user have set their country same to request.user
BUT
When i try to access {{ show_state }} in template it shows nothing.
I have no idea, what am i doing wrong in accessing. Any help would be Appreciated. Thank You in Advance.
Note :- I am using external library to show country and state choices in html.
Advertisement
Answer
There seems to be a filter
problem.
request.user.profile # Profile Object
# you're filtering by matching country with request.user.profile
Profile.objects.filter(country=request.user.profile)
# Similar for state
Profile.objects.filter(state=request.user.profile)
What you want to do is filter
using request.user.profile.state
and request.user.profile.country
.
# Since this is a view
# Method parameter should be request instead of request.user
def show_user(request):
show = Profile.objects.filter(country=request.user.profile.country)
show_state = Profile.objects.filter(state=request.user.profile.state)
context = {'show':show,'show_state':show_state}
return render(request, 'show_user.html', context)
While this should solve your current problem.
Suggestion
With Django, you can actually filter Profiles with country and state that matches user’s in the same query.
def show_user(request):
user_profile = request.user.profile
valid_profiles = Profile.objects.filter(country=user_profile.country, state=user_profile.state)
context = {'valid_profiles': valid_profiles}
return render(request, 'show_user.html', context)