2017-08-22 25 views
0

私はPOSTリクエストの値を変更しようとしていますが、次のエラーを取得していますポストのデータを変更しますデータ:DjangoはCREATEVIEW

<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': ['']}> 

は、データを変更するには

class NodeCreateView(CreateView): 

model = Node 
form_class = NodeCreateForm 
... 

def post(self, request, **kwargs): 
    request.POST = request.POST.copy() 
    request.POST['owner'] = 2 
    return super(NodeCreateView, self).post(request, **kwargs) 

更新POSTデータ:私は間違っているつもりです

<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': [2]}> 

答えて

3

あなたが隠し入力として所有者を含める必要があり、または、このようなポストデータを変更しません。

まず、フォームから所有者を除外する:form_validメソッドをオーバーライドして、あなたのビューで次に

class NodeCreateForm(forms.ModelForm): 
    class Meta: 
     model = Node 
     exclude = ['owner'] 

、およびインスタンス上owner_idを設定します。

class NodeCreateView(CreateView): 
    model = Node 
    form_class = NodeCreateForm 

    def form_valid(self, form): 
     self.instance.owner_id = 2 
     return super(NodeCreateView, self).form_valid(form) 

私は所有者を想定しています外部キーです。それ以外の場合はform.instance.owner = 2と設定します。

+0

魅力的な作品です。ありがとうございました。 – William

3

copy()を使用して正しくrequest.POSTに突然変異を起こしていますが、変更されたリクエストオブジェクトをsuper().post()に渡すのは間違いです。コールチェーンをたどってビューが実際にリクエストオブジェクトにアクセスしている場所に戻ると、変更されたリクエストを使用していないため、変更されていないリクエストをself.requestとして使用しています。 hereを参照してください。

あなたがやっていることを達成するにはより良い方法がありますが、永久的でない場合はNodeCreateViewget_form_kwargs()を上書きできます。あなたのケースのための

1

例えば、get_form_kwargsを上書きするためのより良い方法:

def get_form_kwargs(self): 
    kwargs = super(NodeCreateView).get_form_kwargs() 
    kwargs['data'].update({'owner': 2}) 
    return kwargs 
関連する問題