2012-03-28 12 views
1

ユーザーが10進値 'amount'を編集できるようにしようとしています。ユーザーが「編集」をクリックすると、小数フィールドが表示されます。ユーザーが入力でモデルを編集する。 ValueError

...値の変更が完了し、 "完了" をクリックした場合には、このエラーがスローされます。ここでは

Exception Type: ValueError Exception Value: Cannot use None as a query value

は私のテンプレートです:

<form class="nice input-prepend edit-allocation-form" action="/portfolio/edit/" method="POST"> 
    {% csrf_token %} 
    <input class="input-text required number" type="text" name="edit_amount{{ investment.position.id }}" {% if investment.position.amount %}value="{{ investment.position.amount }}"{% endif %}> 

    <a href="#" class="edit" id="edit{{ investment.position.id }}">edit</a> 
    <button class="hide" type="submit" id="saveAmountButton"></button> 
</form> 

そして、ここに私の見解です:

@login_required 
def edit(request): 
    if request.method == 'POST': 
     profile = get_object_or_404(InvestorProfile, user=request.user) 
     position = InvestorPosition.objects.filter(id__in=request.POST.get('id')) 
     if Decimal(request.POST['edit_amount' + str(position.id)]) != position.amount: 
      position.amount = Decimal(request.POST['edit_amount' + str(position.id)]) 
      position.save()     
    return HttpResponseRedirect(request.POST.get('next', '/portfolio/')) 

私はこの仕事をすることはできません。 noobを助けてください?

+4

'request.POST.get( 'id')'は何かを返します( 'None'ではありません)?私はあなたのフォームがどこかに 'id'フィールドを設定しているのを見ていませんか? – nijansen

+0

これは正解であるため、答えとして投稿したはずです。彼はいくつかのJSを持っていない限り、彼はそのIDが投稿されることは決してないので、返すことは決してありません。 – John

+0

私はこのコードを追加したいと思います。 の代わりに

答えて

2

上記のコメント者のように、フォームは "id"という名前のフィールドを投稿していません。あなたが望むのは "edit_amount {{id}}"です。

ここでは、フォームフィールド名からIDを抽出する方法の例を示します。それはexception catchingとあなたが目にしたいと思ういくつかの他の "落書き"が欠けています。しかし、これは基本的な考え方です。

この方法ではなく、hidden form fieldにIDを追加することをお勧めします。また、ユーザーのcheck the permissionsに連絡し、その特定のレコードを変更できることを確認してください。

@login_required 
def edit(request): 
    # Skipping the first couple lines. 
    id = None 
    for key in request.POST.keys(): 
     if 'edit_amount' in key: 
      id = int(key[11:]) 

    position = InvestorPosition.objects.get(id=id) 

    position.amount = Decimal(request.POST.get('edit_amount%s' % id)) 
    position.save() 

    return HttpResponseRedirect(request.POST.get('next', '/portfolio/')) 
+0

ありがとうございました。非表示の入力を追加すると、エラーは表示されなくなります。 – Modelesq

関連する問題