在 django 中使用 TaggableManager 建立 m2m 关系
Using TaggableManager for m2m relationship in django
我正在尝试使用 TaggableManager() 在 Django 应用程序的表单中添加标签,但这似乎不起作用。
class UserBookmark(models.Model):
user = models.ForeignKey(User)
bookmark = models.URLField()
tag = TaggableManager()
def __str__(self):
return '%i %s %s'%(self.id,self.user,self.bookmark)
我的 html 模板:
<div class="modal-body">
<form name = "form2" id = "form2" method = "post" action = "{% url 'savetag' %}" class = "form-inline">
{% csrf_token %}
<div class = "form-group">
<input name = "tag" id = "tag" required>
<input type="hidden" id = "field1" name="bookmark" value="">
<button type = "submit" class = "btn btn-danger">Save</button>
</div>
</form>
</div>
views.py :
def save_tag(request):
tagslist = request.POST.getlist("tag")
bookmark = request.POST.get("bookmark")
obj=UserBookmark.objects.get(bookmark = bookmark)
user = request.user.pk
obj.tag = tagslist
obj.save()
当我点击这个查询时
UserBookmark.objects.filter(tag__name__in = ['java'])
我得到空集,
虽然我确实有带有此标签的记录 java.
早些时候我的 UserBookmark
模型 tag 属性是 CharField
:
tag = models.CharField(max_length = 100)
但这不起作用,因为标签具有多对多关系,因为书签可以有多个标签,所以 CharField 不起作用。
有人可以告诉我这里需要更正的地方吗?
您必须使用 add()
在 ManyToMany 字段中添加项目
def save_tag(request):
# Use get() instead of getlist() beacuse in request it is a string 'Python,Data Science' not array
tagslist = request.POST.get("tag")
# Use split to make it a list
tagslist = [str(r) for r in taglist.split(',')]
...
# use add to add item in ManyToMany field.
obj.tag.add(*tagslist)
obj.save()
现在您的查询可以正常工作了。
我正在尝试使用 TaggableManager() 在 Django 应用程序的表单中添加标签,但这似乎不起作用。
class UserBookmark(models.Model):
user = models.ForeignKey(User)
bookmark = models.URLField()
tag = TaggableManager()
def __str__(self):
return '%i %s %s'%(self.id,self.user,self.bookmark)
我的 html 模板:
<div class="modal-body">
<form name = "form2" id = "form2" method = "post" action = "{% url 'savetag' %}" class = "form-inline">
{% csrf_token %}
<div class = "form-group">
<input name = "tag" id = "tag" required>
<input type="hidden" id = "field1" name="bookmark" value="">
<button type = "submit" class = "btn btn-danger">Save</button>
</div>
</form>
</div>
views.py :
def save_tag(request):
tagslist = request.POST.getlist("tag")
bookmark = request.POST.get("bookmark")
obj=UserBookmark.objects.get(bookmark = bookmark)
user = request.user.pk
obj.tag = tagslist
obj.save()
当我点击这个查询时
UserBookmark.objects.filter(tag__name__in = ['java'])
我得到空集, 虽然我确实有带有此标签的记录 java.
早些时候我的 UserBookmark
模型 tag 属性是 CharField
:
tag = models.CharField(max_length = 100)
但这不起作用,因为标签具有多对多关系,因为书签可以有多个标签,所以 CharField 不起作用。
有人可以告诉我这里需要更正的地方吗?
您必须使用 add()
在 ManyToMany 字段中添加项目
def save_tag(request):
# Use get() instead of getlist() beacuse in request it is a string 'Python,Data Science' not array
tagslist = request.POST.get("tag")
# Use split to make it a list
tagslist = [str(r) for r in taglist.split(',')]
...
# use add to add item in ManyToMany field.
obj.tag.add(*tagslist)
obj.save()
现在您的查询可以正常工作了。