2012-05-30 2 views
5

これは考慮事項としてご質問ください。誰かが以下の ソリューションのいずれかを使用するかもしれません。DjangoユーザーのHiddenInputと、クラスベースのビューを持つビューに直接保存する場合

私はForeignKey(User)フィールドを含むいくつかのモデルを持っています。 クラスベースの作成ビューは、汎用CreateViewから派生しています。

新しいオブジェクトの追加時に関連するユーザーを保存するには、2つのオプションがあります:form_validメソッドをオーバーライドすることにより、ビューでフォームを保存する

  1. は、隠しフィールドにユーザID格納さ(露出)でフォームを保存

    class CreateOfferView(CreateView): 
    
        model = Offer 
        form_class = SomeModelFormWithUserFieldExcluded 
    
        def form_valid(self, form): 
         instance = form.save(commit=False) 
         instance.user = self.request.user 
         instance.save() 
    
  2. これはuser_idを公開しない(および他のここで露出されるべきではないデータを言及していません)。 ここに難しい部分があります。ユーザーフィールドを持つモデルが増えています...フォームを作成するときに 初期(現在ログインしている)ユーザーでユーザーフィールドを入力する必要があり、そのフィールドを非表示にする必要があります。この目的のために私が使ってきた私のOwnFormMixin

    class OwnFormMixin(object): 
    
        def get_form(self, form_class): 
         form = super(OwnFormMixin, self).get_form(form_class) 
         form.fields['user'].widget = forms.HiddenInput() 
    
        def get_initial(self): 
         initial = super(OwnFormMixin, self).get_initial() 
         initial['user'] = self.request.user.pk 
         #I could also do this in get_form() with form.fields['user'].initial 
    
    class CreateOfferView(OwnFormMixin, CreateView): 
        model = Offer 
        form_class = SomeModelFormWithAllFields 
    

あり、よりCreateXXXView使用OwnFormMixin ..あなたがフォームにユーザーデータを保存するにはどうすればよい

あなたのビューに直接保存しないでください。賛否両論は何ですか?あなたはにユーザーがそのForeignKeyFieldを変更できるようにしている場合を除き

+0

なぜ検証でrequest.userを使用しないのですか?他のユーザーからPOST aに返信する可能性はありますか?なぜ、djangoのユーザデータに関連するものも、フォームや可視部分に公開するのはなぜですか?それは潜在的な脆弱性です... – garmoncheg

答えて

2

は、フォームに含める理由はありません - 私はあなたの最初のあなたのModelFormのうち、ユーザがフィールドを維持するためにexcludeを使用しての溶液、および設定でいいよユーザーはrequest.userです。実際には、Django documentation now has an example along these exact linesです。

user_idパラメータの操作から保護する必要はなく、内部ユーザーIDが公開されておらず、異なるの更新の場合を気にする必要はありません。わずかな欠点は、オブジェクトの関連性を変更する能力が必要な場合は、Userを再起動する必要があることです。

関連する問題