我试图使用通用视图将当前登录的用户作为属性分配给modelform实例的字段。我已经引用了thisSO post并重写了post
方法,但它给了我一个错误,CreatedBy字段是必需的。另外,我在ccbv上经历了mro
很多次。如下图所示。在
class PostCreate(LoginRequiredMixin, CreateView):
model = Post
form_class = PostForm
success_message = "Post Updated"
success_url = '/home/'
def get_form(self, form_class=None):
"""
Returns an instance of the form to be used in this view.
"""
form = super(PostCreate, self).get_form(form_class)
form.instance.CreatedBy=User.objects.get(id=self.request.user.id)
return form
def get_initial(self):
"""
Returns the initial data to use for forms on this view.
"""
self.initial = {'CreatedBy': User.objects.get(id=self.request.user.id)}
return self.initial.copy()
def get_form_kwargs(self):
"""
Returns the keyword arguments for instantiating the form.
"""
kwargs = {
'initial': self.get_initial(),
'prefix': self.get_prefix(),
}
if self.request.method in ('POST', 'PUT'):
kwargs.update({
'data': self.request.POST,
'files': self.request.FILES,
})
return kwargs
我重写所有这些方法的原因是为了检查每个方法中初始dict的可用性。它在所有方法中都可用,但表单验证仍然失败。但我认为最好不要在get_initial(self)
中设置值,因为我不会用任何已保存对象的现有数据预填充表单字段,而是希望update a field of an initialized form with User object of logged in user
。我已经在ipdb
中经历了控制流,但却遇到了同样的错误。在
请注意,我不是在寻找被操纵的form_valid(self)
方法。
我被这事缠住了好几个小时。任何帮助都是非常感谢的。在
created_by仍然是必需的,因为您没有将其从表单中排除;您需要在PostForm中执行此操作。在
至于自动分配,编辑视图上的文档有一个specific section精确地描述了如何做到这一点;您可以覆盖
^{pr2}$form_valid()
:相关问题 更多 >
编程相关推荐