在Django的CreateView中将当前用户传递给initial

5 投票
1 回答
6046 浏览
提问于 2025-04-17 21:13

在我的项目中,我有一个来自标准 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 这个字段。其实这样也没什么意义,因为你不希望用户能更改这个值。

撰写回答