【问题标题】:django - django-taggit formdjango - django-taggit 表单
【发布时间】:2011-07-18 14:22:29
【问题描述】:

我想使用django-taggit (click here)。文档 ( click here) 谈到使用 ModelForm 生成表单,但我已经有了想要使用的表单。

假设我有这样的事情:

forms.py

class MyForm(forms.Form):
    ......
    tags = forms.CharField(max_length=200, widget=forms.Textarea)

如何保存来自tags 字段的标签?我的views.py 中有什么内容?一个真实的例子将不胜感激。

【问题讨论】:

    标签: django django-models django-forms django-views django-taggit


    【解决方案1】:

    我对 django taggit 应用程序不太熟悉,但看起来如果你想使用应用程序使用的相同字段和小部件设置,你可以从 taggit.forms (https://github.com/alex/django-taggit/blob/master/taggit/forms.py) 中导入它们:

    你的models.py:

    from django.db import models
    
    from taggit.managers import TaggableManager
    
    class Food(models.Model):
        name = models.CharField(max_length=20)
    
        tags = TaggableManager()
    

    你的forms.py

    from taggit.forms import *
    
    class MyForm(forms.Form):
        name = forms.CharField()
        m_tags = TagField()
    

    TagField 将使用 taggit 应用程序中 utils.py 中的 parse_tags 方法返回处理后的输入。返回看起来是一个清理列表(set(words))

    你的意见.py

    if form.is_valid():
        name = form.cleaned_data['name']
        m_tags = form.cleaned_data['m_tags']
        object = Food(name=name)
        object.save()
        for m_tag in m_tags:
            object.tags.add(m_tag)
        return HttpResponseRedirect('/thanks/')
    

    【讨论】:

    • 这当然不会删除标签,如果您已将它们标记为删除。
    【解决方案2】:

    我无法评论使用过的/“绿色勾选”的答案。但我会改变块

    for m_tag in m_tags:
        object.tags.add(m_tag)
    

    object.tags.add(*m_tags)
    

    【讨论】:

      【解决方案3】:

      在此处查看说明:https://github.com/alex/django-taggit/blob/master/docs/forms.txt

      如果在保存表单时使用commit=False 选项,则需要调用 save_m2m() 保存对象后在表单上,​​就像您保存对象一样 表单上有正常的多对多字段::

      if request.method == "POST":
          form = MyFormClass(request.POST)
          if form.is_valid():
              obj = form.save(commit=False)
              obj.user = request.user
              obj.save()
              # Without this next line the tags won't be saved.
              form.save_m2m()
      

      【讨论】:

        猜你喜欢
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多