使用另一个模型(外键)的初始值填写表单字段

时间:2017-12-15 08:58:05

标签: django django-forms

我有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在验证时调用,我想在表单初始化验证之前显示此信息,我不知道如何

2 个答案:

答案 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稍后传递给另一个方法,而不是重做查询。