在 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
外键设为可选来轻松解决此问题。
我遇到一个错误:
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
外键设为可选来轻松解决此问题。