【问题标题】:Django-autocomplete-light how to get data from html?Django-autocomplete-light 如何从 html 中获取数据?
【发布时间】:2015-08-23 21:36:51
【问题描述】:

我无法从包含 django-autocomplete-light 生成的数据的 HTML 元素中获取数据。 这是表单的代码:

class ThreadForm(forms.Form):
topic = forms.CharField(label="Topic", max_length=255)
body = forms.CharField(label="Body", widget=forms.Textarea(attrs={'rows': '12', 'cols':'100'}))
tags = autocomplete_light.fields.MultipleChoiceField(choices=(tuple((tag.name, tag.name) for tag in Tag.objects.all())),
                                      label='Tags',
                                      widget=autocomplete_light.widgets.MultipleChoiceWidget('TagAutocomplete',
                                                                                    attrs={'class':'form-control',
                                                                                           'placeholder':'Tag'}
                                                                                     )
                                                  )

def save(self, author, created):
  topic = self.cleaned_data['topic']
  body = self.cleaned_data['body']
  tags = self.cleaned_data['tags']
  th = Thread(author = author,
              topic = topic,
              body = body,
              created = created,
                )
  rtags = []
  for tag in tags:
      sr = Tag.objects.get(tag)
      rtags.append(sr.name)
  th.save()
  Tag.objects.update_tags(th, tags)

还有 autocomplete_light_registry.py:

from threads.models import Thread
import autocomplete_light
from tagging.models import Tag

class TagAutocomplete(autocomplete_light.AutocompleteModelBase):
    search_fields = ['^name']
autocomplete_light.register(Tag, TagAutocomplete, attrs={
    'data-autocomplete-minimum-characters': 1,
},)

如您所见,我更改了 django-autocomplete 应用程序。在 base.py 我发现了一个变量choice_html_format = '<span data-value="%s" name="choice">%s</span>' 我添加了属性name 来获取这样的数据:

tags = request.POST.get('name')

但这不起作用。我收到类似"NoneType in not callable" 的错误 我尝试的下一件事是将choice_htmlbase.py 更改为:

def choice_html(self, choice):
    """
    Format a choice using :py:attr:`choice_html_format`.
    """
    return self.choice_html_format % (
        escape(self.choice_value(choice)),
        escape(self.choice_label(choice)))

它是原始功能,我已将choice_value(choice) 更改为choice_label(choice)。并得到一个错误"invalid literal for int() with base 10: <tag_name_here>"。看起来data-value 属性仅适用于 int() 类型(但我无法找到可以更改它的位置,可能在 js-function 中,我不知道)。

最后,我试图获取每个标签的 pk,然后通过管理器获取名称。但我收到错误Cannot resolve keyword '4' into field. Choices are: id, items, name

我绝对确信有一种简单的方法可以完成我需要的任务。

【问题讨论】:

    标签: javascript jquery python django django-autocomplete-light


    【解决方案1】:

    autocomplete-light 有一个名为 widget.html 的模板在模板中呈现:

    ...
    {% block select %}
        {# a hidden select, that contains the actual selected values #}
        <select style="display:none" class="value-select" name="{{ name }}" id="{{ widget.html_id }}" multiple="multiple">
            {% for value in values %}
                <option value="{{ value|unlocalize }}" selected="selected">{{ value }}</option>
            {% endfor %}
        </select>
    {% endblock %}
    ...
    

    如您所见,&lt;select&gt; 元素包含自动完成小部件的所有选定选项。

    它的名字(我们稍后会在视图中通过它的 name 属性来识别它)就是自动完成的名字('tags')。

    因此,现在您需要确保模板中的自动完成字段包含在 &lt;form&gt; 标记中,以便提交值(如果您尚未提交)。

    下一步是检索视图中的数据:

    request.POST.getlist('tags')
    

    就是这样。您现在有一个选定值的主键列表:

    >>> print(str(request.POST.getlist('tags'))
    ['1', '3', '4', '7', ...]
    

    【讨论】:

    • 我发现我的错误。在sr = Tag.objects.get(tag),忘记加pk了sr = Tag.objects.get(pk=tag)
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2021-10-29
    • 2015-10-15
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多