英文:
Search Customers that are part of the logged on User's Business?
问题
我目前的代码如下,在我的views.py中我无法弄清楚如何设置我的搜索功能。所有其他函数都能正常工作。
models.py
class User(AbstractUser):
"用户可以是员工或客户"
class Business(models.Model):
business = models.CharField(max_length=50)
class BusinessOwner(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True )
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True)
class Customer(models.Model):
"客户特定信息"
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True )
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True)
class Employee(models.Model):
"员工特定信息"
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True, blank=True)
forms.py
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ("username", "email", "password1", "password2", "first_name", "last_name",)
class BusinessOwnerForm(forms.ModelForm):
... 没有字段
class EmployeeForm(forms.ModelForm):
... 没有字段
class CustomerForm(forms.ModelForm):
... 没有字段
class BusinessForm(forms.ModelForm):
class Meta:
model = Business
fields = ("business",)
views.py(用户创建流程)
...(省略其他内容)
def searchUsers(request):
...(省略其他内容)
def employeeCreation(request):
"创建员工"
...(省略其他内容)
def customerCreation(request):
"创建客户"
...(省略其他内容)
...(省略其他内容)
search_users.html
英文:
The code I currently have is this, in my views.py I can't figure out how to set up my search function. All other functions work.
models.py
class User(AbstractUser):
"""User can be Employee or Customer"""
class Business(models.Model):
business = models.CharField(max_length=50)
class BusinessOwner(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True )
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True)
class Customer(models.Model):
""" Customer-specific information """
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True )
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True)
class Employee(models.Model):
""" Employee-specific information """
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True, blank=True)`
forms.py
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ( "username", "email", "password1", "password2", "first_name", "last_name", )
class BusinessOwnerForm(forms.ModelForm):
. . . no fields
class EmployeeForm(forms.ModelForm):
. . . no fields
class CustomerForm(forms.ModelForm):
. . . no fields
class BusinessForm(forms.ModelForm):
class Meta:
model = Business
fields = ( "business", )
views.py (user creation process)
def searchUsers(request):
qs_owned_businesses = BusinessOwner.objects.filter(user = request.user).values('business_id')
qs_biz_customers = Customer.objects.filter(business_id__in=qs_owned_businesses)
if request.method == "GET":
query = request.GET.get('search')
if query == '':
query = 'None'
results = User.objects.filter(username__icontains=query, id__in=qs_biz_customers)
return render(request, 'search_users.html', {'query': query, 'results': results})
#example of hows employees and customers are created in my views:
def employeeCreation(request):
"""Creates an Employee"""
if request.method == "POST":
employee_form = EmployeeForm(request.POST)
user_creation_form = UserForm(request.POST)
if (user_creation_form.is_valid() and employee_form.is_valid()):
employee_form.instance.business = request.user.businessowner.business
new_user = user_creation_form.save(commit=False)
employee_form.instance.user = new_user
user_creation_form.save()
employee_form.save()
messages.success(request, "You Have Created An Employee" )
return redirect("user-homepage")
else:
messages.error(request, "Try creating an Employee Again something went wrong.")
employee_form = EmployeeForm()
user_creation_form = UserForm()
return render (request, "registration/employee_creation.html",
context={"user_creation_form": user_creation_form,
"employee_form": employee_form,
})
def customerCreation(request):
. . . functions is exactly the same as employee creation just for a customer. The Business owner's business is used as a starting point to build employees off of. I didn't incldue that view because it's not necessary for this and stack overflow limits how much code I put here.
search_users.html
{% if results %}
<h1> you Searched for {{ query }} . . </h1>
{% for x in results %}
{{ x }}<p></p>
{% endfor %}
{%endif %}```
I have tried using Q, icontain ,.filter() and django-filter, but this is a tricky search criteria that I can't get to work.
navbar search feature:
<form action="{% url 'search-users' %}" class="form-inline" method="get">
<div class="form-group mx-sm-3 mb-2">
<label for="" class="sr-only">search</label>
<input name="search" type="" class="form-control" id="" placeholder="Keyword">
</div>
<button type="submit" class="btn btn-success btn-lg mb-2">Search</button>
</form>```
</details>
# 答案1
**得分**: 0
让我们将这分解成任务。我使用`values()`来限制请求仅包括我们感兴趣的内容,因为我可以使用该结果进一步筛选。
# 首先,您要获取当前登录用户拥有的所有企业
# (目前他们只能拥有一个,所以您可以使用`get`而不是`filter`,
# 但您以后可能会更改,这种方法仍然有效)
qs_owned_businesses = BusinessOwner.objects.filter(user=request.user).values('business_id')
# 接下来,您要获取这些企业的所有客户
qs_biz_customers = Customer.objects.filter(business_id__in=qs_owned_businesses).values('user_id')
# 最后,您要根据您的表单字段进一步筛选这些客户
# 请记住,`icontains`条件需要引用一个字段
# 这里我们正在查看用户名,但您可能使用姓氏或其他内容。
results = User.objects.filter(username__icontains=query, id__in=qs_biz_customers)
`results`现在应该是一个用户列表,您可以在模板中循环遍历以显示姓名、用户名等信息。
<details>
<summary>英文:</summary>
Let's break this down into tasks. I'm using values() to limit the request to what we're interested in, as I can then use that result to filter further.
#First you want to get all the businesses the logged in user owns
#(Currently they can only own one, so you could use get rather than filter,
#but you might change that later and this approach will still work)
qs_owned_businesses = BusinessOwner.objects.filter(user = request.user).values('business_id')
#next you want to get all the customers of those businesses
qs_biz_customers = Customer.objects.filter(business_id__in= qs_owned_businesses).values('user_id')
#finally you want to filter those customers further based on your form field
#remember, the icontains criteria needs to refer to a field
#here we're looking at username, but you might use last_name or something else.
results = User.objects.filter(username__icontains=query, id__in=qs_biz_customers)
`results` should now be a list of users you can cycle through in your template to show names, usernames etc.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论