【问题标题】: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()