在 Django CreateView 中使用当前用户初始化 ForeignKey 用户

Using current user to initialize ForeignKey user in Django CreateView

我遇到一个错误:

AttributeError at /courses/create/
'CourseStudentForm' object has no attribute 'user'

当我尝试通过将用户字段设置为当前用户来创建新对象时:

class CourseStudentCreate(CreateView):
    model = CourseStudent
    fields = ['semester', 'block', 'course', 'grade']
    success_url = reverse_lazy('quests:quests')

    @method_decorator(login_required)
    def form_valid(self, form):
        data = form.save(commit=False)
        data.user = self.request.user
        data.save()
        return super(CourseStudentCreate, self).form_valid(form)

这是型号:

class CourseStudent(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    semester = models.ForeignKey(Semester)
    block = models.ForeignKey(Block)
    course = models.ForeignKey(Course)
    grade = models.PositiveIntegerField()
    active = models.BooleanField(default=True)

表单显示正确,但提交时出现错误。

答案:

从这里开始: Pass current user to initial for CreateView in Django

如果我想将用户保留为必填字段,将 form_valid 更改为:

即可
def form_valid(self, form):
    form.instance.user = self.request.user
    return super(CourseStudentCreate, self).form_valid(form)

下面 Burhan Khalid 描述了错误的原因。

它不起作用的原因是您的表单中缺少必填字段 class;回想一下,模型表单验证也将 validate the model instance:

Validation on a ModelForm

There are two main steps involved in validating a ModelForm:

Validating the form
Validating the model instance

在您的 class 中,继承的 post 方法正在调用 is_valid():

def post(self, request, *args, **kwargs):
    """
    Handles POST requests, instantiating a form instance with the passed
    POST variables and then checked for validity.
    """
    form = self.get_form()
    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

您可以看到它仅在 is_valid() return 为真时调用 form_valid();在你的情况下它不能 return true 因为你缺少一个必需的属性。

您可以通过在模型中将 user 外键设为可选来轻松解决此问题。