在Django的CreateView中将当前用户传递给initial
在我的项目中,我有一个来自标准 auth
的 Django 用户模型 User
,还有一个待办事项模型 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 个回答
15
你需要使用 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
这个字段。其实这样也没什么意义,因为你不希望用户能更改这个值。