问题描述
我有一个个人资料模型:
from django.contrib.auth.models import User
class Profile(models.Model):
first_name = models.CharField(max_length=100,blank=True)
last_name = models.CharField(max_length=100,blank=True)
user = models.OneToOneField(User,on_delete=models.CASCADE)
birthday = models.DateField(null=True,blank=True)
bio = models.TextField(blank=True,max_length=1000)
location = models.CharField(max_length=100,blank=True)
...
和搜索联系人视图:
class SearchContactsView(ListView):
model = Profile
template_name = 'users/contact_search.html'
context_object_name = 'qs'
def get_queryset(self):
q1 = self.request.GET.get('contact_name')
q2 = self.request.GET.get('contact_location')
if q1 or q2:
return Profile.objects.filter(Q(first_name__icontains=q1) |
Q(last_name__icontains=q1),location__icontains=q2)
return Profile.objects.all()
它工作正常,但我也希望能够通过用户字段搜索联系人。有人知道这样做的方法吗?
EDIT (我的用户的用户名)是他们在注册该网站时创建的,目前无法编辑。由于它们是OneToOneField,因此会通过下拉列表显示在管理页面上。我认为我的问题是django仅将它们识别为IntegerField('pk'),但我需要以某种方式将其强制转换为字符串值。我是这样认为的,如果可以的话,如何实现?
解决方法
您可以添加到模板中,以允许用户输入user_username并将该用户名保存到q3:
q3 = self.request.GET.get('user_username')
之后,您可以相应地调整If条件,然后将返回值更改为:
Profile.objects.filter(Q(first_name__icontains=q1) |
Q(last_name__icontains=q1),location__icontains=q2,user__username=q3)