2017-12-15 13 views
0

私は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はフィールドcompany_descriptionは、当社モデルから事前に設定されます。また、フォームの初期化時にコード 2)を通して設定され、フィールドdescription(同じ名前ではない) 3)保存時にユーザーがフィールドに何も変更しない場合、初期値は保存時にのみ

1,2,3保存されます。

私は をチェックしましたが、私の場合は最初にFKを設定する必要がありますが、テキストだけでなく、FKモデルからの説明を得るよりもシンプルです。

私は複数の呼び出しを通してURLまたはリクエストから取得することができ、会社のPK /スラグは

path('<int:pk>/post/add/', CompanyPostCreateView.as_view(), name='create') 

とビューでのrequest.user.acc.company:

company_pk = kwargs.get('pk') 

と上書きform_validですが、ここで問題があります。form_validが検証時に呼び出され、フォームの初期化時に検証前にこの情報を表示したいのですが、わかりません。

+0

詳細を表示し、これまでのビューを表示する必要があります。 FKが "コードを通じて"設定されているとすれば、どうやってそれが起こっていますか? –

+0

@DanielRoseman、私は詳細を追加しました。このケースでは、検証が遅すぎるため、私がFKを入手できる場所を正確にはわかりません – user3541631

答えて

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を使用しています。

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} 
+0

私はフォームクラスでCreateViewを使用します – user3541631

+0

それで、ビュー。しかし私の更新を見てください。 –

+0

@Danile Roseman私はView(デフォルトのジェネリックcreateviewの横)を持っていませんでした。私は解決策を見つけたと私は大丈夫だと思う、少なくとも動作している – user3541631

関連する問題