2011-04-03 67 views
0

我已經關注了Django ContentTypes,然後我創建了一個用於標記目的的應用程序。多態性中的值錯誤Django模型關聯

Like django-taggit or tagging

tagging.models.py

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 
from django.template.defaultfilters import slugify 

class Tag(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True, max_length=100) 

    def __unoicode__(self): 
     return self.name 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     super(Tag, self).save(*args, **kwargs) 

class TaggedItem(models.Model): 
    tag = models.ForeignKey(Tag) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object = generic.GenericForeignKey('content_type', 'object_id') 

    def __unicode__(self): 
     return self.tag.name 

blog.models.py

class Article(models.Model): 
    title = models.CharField(max_length=250) 
    content = models.TextField() 

    ## 
    tags = generic.GenericRelation(TaggedItem) 

blog.views.py

article = Article.objects.create(user=request.user) 
article.title = form.cleaned_data['title'] 
article.body = form.cleaned_data['body'] 

## 
tag_names = form.cleaned_data['tags'].split() 
for tag_name in tag_names: 
    tagged = TaggedItem(object=article, tag=tag_name) 
    tagged.save() 
article.save() 

所以,當我挽救或創造新的article我會得到這個錯誤:

Cannot assign "u'browser'": "TaggedItem.tag" must be a "Tag" instance. 

瀏覽器是標籤字符串!

我覺得這個印刷錯誤,因爲我已經聲明tagForeignKey關係在TaggedItem ...

回答

2

您需要在標籤字符串轉換成實際的標籤對象。

for tag_name in tag_names: 
    tag, created = Tag.objects.get_or_create(name=tag_name) 
    tagged = TaggedItem(object=article, tag=tag) 
tagged.save() 
+0

這是什麼創建的對象? – 2011-04-03 21:32:56

+0

'get_or_create'方法總是返回對象加布爾值來顯示它是否是新創建的。既然你沒有真正使用它,你可以用'_'代替'created'來顯示它是一個拋棄變量。 – 2011-04-03 21:44:13