我有一个带表格的简单数据库:
的公司
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y
的 CompanyDetails
'CompanyID', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment'
'CompanyName', 'varchar(70)', 'NO', '', NULL, ''
'Type', 'enum(\'C\',\'M\',\'S\',\'A\')', 'NO', 'MUL', NULL, ''
'Country', 'varchar(60)', 'YES', 'MUL', NULL, ''
'Website', 'varchar(60)', 'YES', '', NULL, ''
'Email', 'varchar(60)', 'YES', '', NULL, ''
'Telephone', 'double unsigned', 'YES', '', NULL, ''
'Maps_Link', 'varchar(60)', 'YES', '', NULL, ''
以及另外3个表格(联系人,大陆,产品)
我创建了一个应用程序CompanyBrowser。我正在尝试使用下拉菜单创建一个简单的表单:
对于其中的每一个,我希望用户可以选择在下拉菜单中选择所有(*)。
这是我的urls.py:
'CompanyDetailsID', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment'
'CompanyID', 'int(10) unsigned', 'NO', 'MUL', NULL, ''
'Type', 'enum(\'C\',\'M\',\'A\',\'S\')', 'NO', '', NULL, ''
'Category', 'enum(\'MEP Consultant\',\'Lighting Designer\',\'Architect\',\'Interior Designer\',\'MEP Contractor\',\'Fitout Contractor\',\'Procurement Company\',\'Developer\',\'Outdoor-Architectural\',\'Indoor-Architectural\',\'Indoor-Decorative\',\'Outdoor-Decorative\',\'Lamps\',\'Drivers\',\'Control Systems\',\'Landscaping Consultant\',\'Landscaping Contractor\',\'Other\')', 'NO', '', NULL, ''
'Comments', 'blob', 'YES', '', NULL, ''
基本上,我将根据url CompanyBrowser / company_type / company_category / company_country显示,其中用户可以输入*,即所有搜索字段的所有内容。
这是我到目前为止编码的ResultsView:
urlpatterns=[url(r'^$',views.Index,name='index'),
url(r'^(?P<company_type>[CMSA*])/$',views.ResultsView.as_view(), name='results'),
url(r'^(?P<company_type>[CMSA*])/(?P\<company_category>\w+)/$',views.ResultsView.as_view(), name='results'),
url(r'^(?P<company_type>[CMSA*])/(?P<company_category>\w+)/(?P<company_country>\w+)/$',views.ResultsView.as_view(), name='results'),
]<br>
这样做的优雅方法是什么,而不是做各种各样的组合?我想如果有一个选项可以在过滤器查询中输入所有内容,这可能很容易实现吗?
答案 0 :(得分:1)
您可能想以这种方式编写它。此外,您最有可能希望使用单独的表单将GET请求作为&#34;过滤器&#34;。
class ResultsView(generic.ListView):
template_name='CompanyBrowser/results.html'
context_object_name="results_of_company_type_query"
def get_queryset(self):
if self.kwargs.get('company_type') == 'M' and self.kwargs.get("company_category") == "Indoor-Decorative":
return Company.objects.filter(companytype="M", companydetails__category="Indoor-Decorative")
elif self.kwargs.get('company_type') != '*':
return Company.objects.filter(companytype=self.kwargs['company_type'])
else:
return Company.objects.all()
答案 1 :(得分:0)
def get_queryset(self):
for i in self.kwargs:
if self.kwargs[i]=="*":
self.kwargs[i]=""
print(self.kwargs)
print(len(self.kwargs))
if len(self.kwargs)==1:
queryset= Company.objects.filter(country__country__contains=self.kwargs['country'])
print (queryset.query,"\n", len(queryset))
return queryset
elif len(self.kwargs)==2:
queryset= Company.objects.filter(country__country__contains=self.kwargs['country'],
companytype__contains=self.kwargs['company_type'])
print (queryset.query,"\n", len(queryset))
return queryset
elif len(self.kwargs)==3:
queryset= Company.objects.filter(country__country__contains=self.kwargs['company_country'],
companytype__contains=self.kwargs['company_type'],
companydetails__category__contains=self.kwargs['company_category'],)
print (queryset.query,"\n", len(queryset) )
return queryset
现在可以使用了。我在任何地方使用包含,所以如果搜索词是空字符串,我的查询将返回所有对象。此外,由于国家是表大陆的外国钥匙。我使用 country__country__contains 。