/ admin / main / category / add / NOT NULL约束中的IntegrityError失败:main_category.author_id

时间:2015-12-31 23:08:41

标签: python django sqlite

我不确定为什么会出现这种错误。在我仅限制一个类别后,由一个用户创建它。但我希望能够在管理页面内创建多个类别页面。我尝试通过管理页面创建类别页面,它给了我错误:

IntegrityError at /admin/main/category/add/
NOT NULL constraint failed: main_category.author_id

我甚至不确定它发生在哪里。

Exception Type: IntegrityError at /admin/main/category/add/
Exception Value: NOT NULL constraint failed: main_category.author_id

IntegrityError

Exception Value:    
Exception Location: /Desktop/ebagu0.2/env/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 318
Python Executable:  Desktop/ebagu0.2/env/bin/python

我的模特

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True)
    slug = models.CharField(max_length=100, unique=True)
    author = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True)
    def save(self, *args, **kwargs):
        self.slug = uuslug(self.name,instance=self, max_length=100)
        super(Category, self).save(*args, **kwargs)

我的观点

@login_required
def add_category(request):
    if Category.objects.filter(author=request.user).exists():
        return render(request,'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, instance=category)
        if form.is_valid():
            form.save(commit=True)
            return redirect('index')

    else:
        form = CategoryForm()

    return render(request, 'main/add_category.html', {'form':form})

我的管理员

class CatAdmin(admin.ModelAdmin): 

    prepopulated_fields = {'slug':('name',)}
    fields = ['name', 'slug']

1 个答案:

答案 0 :(得分:0)

Exception Value: NOT NULL constraint failed: main_category.author_id

您忘记通过管理员设置author

class CatAdmin(admin.ModelAdmin): 

    prepopulated_fields = {'slug':('name',)}
    fields = ['name', 'slug', 'author']
    #                       ^^^^^^^^^^

根据您的需要,您可能希望将author字段设为可选:

class Category(models.Model): 
    ...
    # remove unique=True, add null=True
    author = models.OneToOneField(settings.AUTH_USER_MODEL, null=True)
    #                                                       ^^^^^^^^^
    ...

顺便说一句,请注意,如果使用非空OneToOneField,则指定unique=True是多余的。