繁体   English   中英

Django-taggit 标签值检索和格式化失败

[英]Django-taggit tag value retrieval and formatting failing

我正在尝试为个人资料实施标记过程,以便您可以添加您的爱好。 我选择了 django-taggit,因为它看起来很简单,而且可以做我需要做的事情,而且我自己也不知道如何从头开始。 我已经设法使其在某种程度上起作用,但我遇到了 3 件事:

  1. 不确定控制这些标签的表单字段的最佳方法是什么,因为我通过表单元功能中的小部件调整自动生成表单,但在解决以下两个问题后它可能会正常工作。
  2. 当没有字段爱好(标签)的数据时,该字段将填充一个值为“[]”的单个标签,如下图所示。

在此处输入图片说明

  1. 当我添加“音乐”标签并在我重新加载页面后提交表单时,我会根据图像得到这个“[]”。 我认为这将由图书馆处理,但我在网上看不到另一个类似的场景。

在此处输入图片说明

当我尝试添加另一个“游戏”标签并保存并重新加载时,会发生以下情况。 初始值再次被包装。

在此处输入图片说明

我的模型是:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
hobbies = TaggableManager()

我的表格是:

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ['hobbies',]

    def __init__(self, *args, **kwargs):
      super(UserProfileForm, self).__init__(*args,**kwargs)
      self.fields['hobbies'].widget = forms.TextInput()
      self.fields['hobbies'].widget.attrs['data-role'] = "tagsinput"
      self.fields['hobbies'].widget.attrs['class'] = "form-control"
      self.fields['hobbies'].required = False

我的视图功能是:

if request.method == 'POST':
        user_profile = UserProfile.objects.get(user=request.user)
        form = UserProfileForm(request.POST, instance=user_profile)
        print(form)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.user = request.user
            obj.save()
            print("Form valid")
            form.save_m2m()

使用:

<script src="/static/js/tagsinput.js"></script>
<link rel="stylesheet" href="{% static 'css/tagsinput.css' %}" />

因此,经过相当多(数百次)测试后,我终于缩小了问题的范围,并试图以成功的结果解决它。 似乎数据通过我使用的标签输入库修改为标签对象。 只有当在 forms.py 中将“数据角色”指定为“标签输入”时,数据才会作为这些对象进入 html 端并显示不正确。 所以相反,我想保持数据干净,最后只在视觉方面应用 data-role='tagsinput' ,我使用了:

var hobbiesTags = document.getElementById("id_hobbies");
  if(hobbiesTags){
  var att = document.createAttribute("data-role");
  att.value = "tagsinput";
  hobbiesTags.setAttributeNode(att);
  };

这导致了以下情况。 也许有更好的方法可以做到这一点,我不确定,但这是一个非常干净的解决方案。 分享您的替代方案。

在此处输入图片说明

我有这个完全相同的问题。

一种解决方案是在将标签列表转换为表单的逗号分隔字符串应用data-role="tagsinput"

这是解决方案:

class MyModelForm(forms.ModelForm):

    class Meta:
        model = MyModel

    def __init__(self, **kwargs):
        self.fields['tags'].widget.attrs['value'] = ", ".join(list(self.instance.tags.names()))
        self.fields['tags'].widget.attrs['data-role'] = "tagsinput"

输出:

腋窝报价

如您所见,多词标签周围出现引号存在问题 它还会使带引号的新标签保存到数据库中。

引用的腋窝

如果双引号没有出现在多词短语周围,这将是最优雅的解决方案。 如果将来有人解决了这个问题,请留言!

我的模板是这样的:

  <div class="m-3 p-3 border">
    <form method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      {{ form|crispy }}
      <button class="btn btn-primary" type="submit">Save Form</button>
    </form>
  </div>

我知道我可以使用模板标签从标签字段本身中去除额外的引号,但是我必须手动创建所有表单字段才能设置标签模板标签。

目前,我的解决方案是简单地使用 Javascript 并修改表单的 Meta 小部件部分。

最终答案(目前):

表格.py

class CourseManageDetailsForm(forms.ModelForm):

    class Meta:
        model = MyModel

        widgets = {
            'tags': forms.TextInput(attrs={
                "data-role": "tagsinput",
            })
        }

custom.js - 将此脚本放在加载表单的页面上。

document.addEventListener("DOMContentLoaded", function(event) {
    let tags_input = document.querySelector('#id_tags');
    let tags_input_value = tags_input.value;
    let new_value = [...tags_input_value.matchAll(/<Tag:\s*([\w\s]+)>/g)].map(([, m]) => m).join(', ')
    tags_input.setAttribute('value', new_value);
}

因此,我们所做的只是修改前端表示,并保持所有后端内部表单功能不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM