【问题标题】:return queryset for specific fields to autocomplete formfields返回特定字段的查询集以自动完成表单字段
【发布时间】:2020-01-28 07:59:15
【问题描述】:

我不是 django 专家,所以我不确定我是否只是在寻找错误的东西,但我正在尝试使用 django-autocomplete-light 来自动完成模型表单上的某些字段。

我有一个模型,Animal。动物有几个领域。我的目标是拥有一个对其中几个字段具有自动完成功能的模型表单。

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') 返回实际值,而不是查询集。

如果我将查询集更改为:

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'

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    如果您想为特定字段自动完成,而不是 charfield 将该字段作为外键并实现自动完成。例如,如果您在 Animal 类中有名为 dog 的字段,则创建一个 Dog 类并在表单中您可以通过以下方式进行操作

    class AnimalCreateForm(forms.ModelForm):
        dog = forms.ModelChoiceField(
            queryset=Dog.objects.all(),
            widget=autocomplete.ModelSelect2(url='dog_auto')
        )
        class Meta:
            model = Animal
            fields = [
            'dog', ----,
        ]
    

    【讨论】:

    • 谢谢,会调查的。你是说它绝对不能用于charfield吗?我认为它适用于 charfield 我想只是因为我已经为 django-taggit 的 taggablemanager 字段实现了自动完成,所以我认为它可以支持任意字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多