将当前用户传递给Django中CreateView的初始值

时间:2014-03-06 23:50:08

标签: python django

在我的项目中,我有来自标准User Django模型和auth模型的Todo模型。用户可以有很多Todo。

当用户签名创建待办事项时,必须自动将其分配给待办事项。我想将当前用户传递给CreateView的初始数据。在我看来,我是正确的。这就是表单对象的外观:

class TodoView(CreateView):
  model = Todo
  fields = ('name', 'date')

  success_url = '/todos/'

  def get_initial(self):
    return {
      'user': self.request.user
    }

这是一个模型:

class Todo(models.Model):
  user = models.ForeignKey(User)
  name = models.TextField()
  date = models.DateField()

但似乎这还不够,因为当有效数据来自客户端时,我有一个例外。这是例外:

IntegrityError at /todos/new

todos_todo.user_id may not be NULL

Request Method:     POST
Request URL:    http://localhost:8000/todos/new
Django Version:     1.6.2
Exception Type:     IntegrityError
Exception Value:    

todos_todo.user_id may not be NULL

Exception Location:     /Library/Python/2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 450
Python Executable:  /usr/bin/python
Python Version:     2.7.5

是否可以将当前用户传递给CreateView的模型?如何在Django的最佳实践中做到这一点?

1 个答案:

答案 0 :(得分:12)

您需要使用form_valid方法而不是get_initial。像这样:

def form_valid(self, form):
    form.instance.user = self.request.user
    return super(TodoView, self).form_valid(form)

我从未使用get_initial,但我猜它没有做任何事情,因为你没有包含user字段。这无论如何都没有用,因为您不希望用户能够更改该值。