2017-02-10 63 views
0

我得到:Django的 - 的ModelForm不保存由于缺少用户ID

IntegrityError at /category/ 
NOT NULL constraint failed: transactions_category.user_id 

在这里我的观点:

elif "create" in request.POST: 
     createform = CategoryForm(data=request.POST) 
     createform.save(commit=False) 
     createform.user = request.user 
     createform.save() <--- specifically here, the .save with commit=False goes through and I can also set the user 

我与调试器和createform.user检查有一个用户,那用户也有一个ID。

forms.py:

class CategoryForm(ModelForm): 
    class Meta: 
     model = Category 
     exclude = ["subcategory", "user"] 

models.py:

class Category(models.Model): 
    title = models.CharField(max_length = 100) 
    subcategory = models.ManyToManyField("self", blank=True, symmetrical=False) 
    user = models.ForeignKey(User) 

用户导入:

from django.contrib.auth.models import User 

为什么它不救?在调用.save()之前,我设置了用户,用户被设置(并有一个ID),据我可以告诉调试器?

我已经运行了manage.py migrate和manage.py makemigrations,并且所有内容都是最新的。

编辑:

模板:

<p>Create new category form</p> 
<form action="/category/" method="post"> 
    {% csrf_token %} 
    {{ createform.as_p }} 
    <input type="submit" name="create" value="Create new category"> 
</form> 
<hr> 

之前,我添加了“用户”字段模型(和我跑迁移和makemigrations后,我做了新的类别对象的创建和保存工作)

编辑2: 完整视图:

def category_view(request): 
    createform = CategoryForm() 
    searchform = CategorySearchForm() 
    categories = Category.objects.all() 
    categories_left = [] 
    categories_right = [] 

    if request.method == "POST": 
     if "search" in request.POST: 
      categories_left = Category.objects.for_title(request.POST["left-search"], user=request.user) 
      categories_right = Category.objects.for_title(request.POST["right-search"], user=request.user) 
     elif "create" in request.POST: 
      createform = CategoryForm(request.POST) 
      if createform.is_valid(): 
       createform.save(commit=False) 
       createform.user = request.user 
       createform.save() 
     elif "add-subcategory" in request.POST: 
      left = Category.objects.for_id(request.POST["left-category"], user=request.user) 
      right = Category.objects.for_id(request.POST["right-category"], user=request.user) 
      try: 
       left.subcategory.add(right) 
       old = left 
       old.pk = None 
       old.save() 
      except IntegrityError: 
       print("This combination already exists.") # TODO 
    context = {"createform":createform, 
       "searchform":searchform, 
       "categories":categories, 
       "categories_left":categories_left, 
       "categories_right":categories_right} 
    return render(request, "transactions/category_creation.html", context) 

回答

1

尝试保存传递用户的实例。

createform.save(commit=False) 
createform.instance.user = request.user 
createform.save() 
1

窗体的保存方法返回一个实例。您应该更新并保存实例,而不是尝试再次保存表单。

instance = createform.save(commit=False) 
instance.user = request.user 
instance.save()