return 特定字段的查询集以自动完成表单字段
return queryset for specific fields to autocomplete formfields
我不是 Django 专家,所以我不确定我是否只是在搜索错误的东西,但我正在尝试使用 django-autocomplete-light 来自动完成模型表单上的某些字段。
我有一个模型,动物。动物有几个领域。我的目标是拥有一个可以自动完成其中几个字段的模型。
forms.py
class AnimalForm(ModelForm):
class Meta:
model = Animal
fields = [
'myfield'
]
widgets = {
'myfield': autocomplete.ListSelect2(
url='myfield-autocomplete')
}
views.py:
class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated:
return Animal.objects.none()
qs = Animal.objects.filter().values('myfield')
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
我得到:
AttributeError: 'dict' object has no attribute 'pk'
我认为是因为 Animal.objects.filter().values('myfield') returns 是实际值,而不是查询集。
如果我将查询集更改为:
class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated:
return Animal.objects.none()
qs = Animal.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
加载后,我的自动完成字段填充了 Animal 对象的名称字段。我希望能够指定一个任意字段而不是名称。
更新-
错误输出:
[28/Jan/2020 08:02:33] "GET /animals/add HTTP/1.1" 200 47686
C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py:88: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'animals.models.Animal'> QuerySet.
allow_empty_first_page=allow_empty_first_page, **kwargs)
Internal Server Error: /operator-autocomplete/
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 50, in dispatch
return super(ViewMixin, self).dispatch(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py", line 158, in get
return self.render_to_response(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 61, in render_to_response
'results': self.get_results(context) + create_option,
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in get_results
} for result in context['object_list']
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in <listcomp>
} for result in context['object_list']
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 81, in get_result_value
return str(result.pk)
AttributeError: 'dict' object has no attribute 'pk'
如果你想为特定字段自动完成,而不是 charfield 将该字段作为外键并实现自动完成。例如,如果您在 Animal class 中有一个名为 dog 的字段,请创建一个 Dog class 并且在表单中,您可以按照以下方式完成
class AnimalCreateForm(forms.ModelForm):
dog = forms.ModelChoiceField(
queryset=Dog.objects.all(),
widget=autocomplete.ModelSelect2(url='dog_auto')
)
class Meta:
model = Animal
fields = [
'dog', ----,
]
我不是 Django 专家,所以我不确定我是否只是在搜索错误的东西,但我正在尝试使用 django-autocomplete-light 来自动完成模型表单上的某些字段。
我有一个模型,动物。动物有几个领域。我的目标是拥有一个可以自动完成其中几个字段的模型。
forms.py
class AnimalForm(ModelForm):
class Meta:
model = Animal
fields = [
'myfield'
]
widgets = {
'myfield': autocomplete.ListSelect2(
url='myfield-autocomplete')
}
views.py:
class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated:
return Animal.objects.none()
qs = Animal.objects.filter().values('myfield')
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
我得到:
AttributeError: 'dict' object has no attribute 'pk'
我认为是因为 Animal.objects.filter().values('myfield') returns 是实际值,而不是查询集。
如果我将查询集更改为:
class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated:
return Animal.objects.none()
qs = Animal.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
加载后,我的自动完成字段填充了 Animal 对象的名称字段。我希望能够指定一个任意字段而不是名称。
更新- 错误输出:
[28/Jan/2020 08:02:33] "GET /animals/add HTTP/1.1" 200 47686
C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py:88: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'animals.models.Animal'> QuerySet.
allow_empty_first_page=allow_empty_first_page, **kwargs)
Internal Server Error: /operator-autocomplete/
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 50, in dispatch
return super(ViewMixin, self).dispatch(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py", line 158, in get
return self.render_to_response(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 61, in render_to_response
'results': self.get_results(context) + create_option,
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in get_results
} for result in context['object_list']
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in <listcomp>
} for result in context['object_list']
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 81, in get_result_value
return str(result.pk)
AttributeError: 'dict' object has no attribute 'pk'
如果你想为特定字段自动完成,而不是 charfield 将该字段作为外键并实现自动完成。例如,如果您在 Animal class 中有一个名为 dog 的字段,请创建一个 Dog class 并且在表单中,您可以按照以下方式完成
class AnimalCreateForm(forms.ModelForm):
dog = forms.ModelChoiceField(
queryset=Dog.objects.all(),
widget=autocomplete.ModelSelect2(url='dog_auto')
)
class Meta:
model = Animal
fields = [
'dog', ----,
]