在我的项目中,我有来自标准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的最佳实践中做到这一点?
答案 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
字段。这无论如何都没有用,因为您不希望用户能够更改该值。