我有2个型号,公司和邮政。
class Post(Meta):
company = models.ForeignKey(Company, related_name='company', on_delete=models.CASCADE)
company_description = models.TextField(max_length=800)
我需要什么:
1)当用户创建帖子时,the company
FK将通过代码设置
2)同样在表单初始化时,字段company_description
将从公司模型预填充,字段description
(不同名)
3)如果用户未对该字段进行任何修改,则在保存时,初始值将被保存
1,2,3仅限于创作。
我查了Django documentation regarding initialization 但他们的例子,更简单,他们只是得到一些数据/文本,在我的情况下,我首先需要设置FK,而不是从FK模型中获取描述,所以不仅仅是文本。
公司的pk / slug我可以从url或通过多次调用请求获取request.user.acc.company
path('<int:pk>/post/add/', CompanyPostCreateView.as_view(), name='create')
并在视图中:
company_pk = kwargs.get('pk')
并覆盖form_valid
,但问题是,form_valid
在验证时调用,我想在表单初始化验证之前显示此信息,我不知道如何
答案 0 :(得分:0)
这没有什么特别复杂的。您可以在视图的开头获取FK并在初始字典中使用它:
company = Company.objects.get(pk=company_pk)
form = PostForm(intial={'company_description': company.description})
修改使用CreateView,您只需覆盖get_initial
:
def get_initial(self):
company = Company.objects.get(pk=self.kwargs['pk'])
return {'company_description': company.description}
答案 1 :(得分:0)
我通过覆盖get_form_kwargs
找到了解决方案 def get_form_kwargs(self):
self.company = Company.objects.get(pk=self.kwargs['pk'])
kwargs = super().get_form_kwargs()
kwargs['initial']['company_description'] = self.company.description
return kwargs
我使用self.company稍后传递给另一个方法,而不是重做查询。