0

我正在开发 Django 应用程序,但出现以下错误

'Category' object has no attribute '_state'

我的模型是

class Blog(models.Model):
    BlogMeta = models.CharField(max_length=200)
    BlogTitle = models.CharField(max_length=100)
    BlogContent = models.TextField()
    BlogCategory = models.CharField(max_length=300)
    BlogTags = models.CharField(max_length=300)
    BlogDate = models.DateField()
    def __unicode__(self):
        return self.BlogTitle
    def save(self):
        self.BlogDate = datetime.datetime.now()
        Categorylist = re.findall(r'\w+',self.BlogCategory)
        TagList = re.findall(r'\w+', self.BlogTags)
        #Get already existing tags and category
        dbCategoryList = Category.objects.all()
        dbTagsList = Tags.objects.all()
        clisflag = False
        tlisflag = False
        #check if categories and tags in new blog exists previously or not.
        for clis in Categorylist:
            for dbclis in dbCategoryList:
                if (clis == dbclis.CategoryName):
                    clisflag = True
                    break
                else:
                    continue

            if not clisflag:
                createCategory = Category(clis)
                createCategory.save()
            clisflag = False

        for tlis in TagList:
            for dbtlis in dbTagsList:
                if(tlis == dbtlis.TagName):
                    tlisflag = True
                    break
                else:
                    continue
            if not tlisflag:
                createTag = Tags(tlis)
                createTag.save()
            tlisflag = False

class Tags(models.Model):
    TagName = models.CharField(max_length=20)
    TagDesc = models.TextField(null=True)
    def __unicode__(self):
        return self.TagName
    def __init__(self,name):
        self.TagName = name
        self.TagDesc = ""
class Category(models.Model):
    CategoryName = models.CharField(max_length=20)
    CategoryDesc = models.TextField(null=True)
    def __unicode__(self):
        return self.CategoryName
    def __init__(self, name):
        self.CategoryName = name
        self.CategoryDesc = ""

在新的博客文章中,类别被视为逗号分隔值,如果遇到新类别,则将其添加到数据库中。标签也是如此。

我不清楚这_state件事,请您指出正确的方向。非常感谢!

4

1 回答 1

2

你没有跑Model.__init__。你必须这样做。

至少,你需要有一条像super(Category, self).__init__()inside这样的线Category.__init__

在实践中,你有更重要的设计问题。你不应该在属性中包含类名;应该是Category.name,不是Category.CategoryNameCategory.__init__应该使用关键字参数,而不是它自己的特殊参数。描述应该有blank=True而不是null=True. 你不需要Category.__init__

这是您正在执行的操作的稍微整洁的版本:

class Blog(models.Model):
    meta = models.CharField(max_length=200)
    title = models.CharField(max_length=100)
    content = models.TextField()
    categories = models.CharField(max_length=300)
    tags = models.CharField(max_length=300)
    date = models.DateField()

    def __unicode__(self):
        return self.title

    def save(self):
        self.date = datetime.datetime.now()
        category_list = re.findall(r'\w+', self.categories)
        tag_list = re.findall(r'\w+', self.tags)
        #check if categories and tags in new blog exists previously or not.
        db_categories = Category.objects.all()
        for clis in category_list:
            for dbclis in db_categories:
                if clis == dbclis.name:
                    break
            else:
                new_category = Category(name=clis)
                new_category.save()

        db_tags = Tags.objects.all()
        for tlis in tag_list:
            for dbtlis in db_tags:
                if tlis == dbtlis.name:
                    break
            else:
                new_tag = Tags(name=tlis)
                new_tag.save()


class Tags(models.Model):
    name = models.CharField(max_length=20)
    desc = models.TextField(blank=True)
    def __unicode__(self):
        return self.name


class Category(models.Model):
    name = models.CharField(max_length=20)
    desc = models.TextField(blank=True)
    def __unicode__(self):
        return self.name

不过,这仍然很丑陋。首先也是最重要的,tagsand category(重命名为categories)应该是关系,而不是纯文本。

于 2012-05-07T01:48:44.717 回答