0

フォームを表示して同じフォームを保存するビューがあります。ビューを最初に表示するとき、エラーはありません。ただし、ビューに保存 (POSTing) すると、次のエラーが発生します。

/test6/settings/ int() 引数の TypeError は、'QueryDict' ではなく、文字列または数値でなければなりません

意見

@login_required
def keyword_settings(request, keyword):
    keyword = Keyword.objects.get(keyword=keyword, status="Active")

    # If we had a POST then get the request post values.
    if request.method == 'POST':
    # Populate the form with the instance.
        form = KeywordFrom(request.POST, instance=keyword)
        # Check we have valid data before saving trying to save.
        if form.is_valid():
            form.save()

    form = KeywordFrom(instance=keyword, user=request.user)
    context = {'form': form}
    return render_to_response('sms/keyword_settings.html', context, context_instance=RequestContext(request))

class KeywordFrom(forms.ModelForm):

    def __init__(self, user=None, *args, **kwargs):
        """
        Init method.
        """
        super(KeywordFrom, self).__init__(*args, **kwargs)
        if user is not None:
            this_originator_name = Originator.objects.for_user(user)
            self.fields['sender_name'] = forms.ModelChoiceField(queryset=this_originator_name)

    class Meta:
        model = Keyword

問題が sender_name にあることはわかっていますが、別のことを試してみましたが解決しませんでした。

4

1 に答える 1

7

__init__フォームのメソッドをどのようにオーバーライドしたかを見てください。

def __init__(self, user=None, *args, **kwargs):

したがって、最初の明示的なパラメーター (暗黙の の後self) はuserです。

次に、POST ブロックでフォームをインスタンス化する方法を見てください。

form = KeywordFrom(request.POST, instance=keyword)

したがって、渡す最初のパラメーターは POST です。しかし、フォームはその位置に期待userしており、そこに渡したものは何でもその変数に入れます。

POST でインスタンス化するときにユーザーを渡す必要があります。これにより、問題が解決します。しかし、これは、クラスのデフォルトの署名をいじるのはなぜ悪い考えなのかを示しています。本当に署名を保存して、userfromを取得する必要がありkwargsます。

def __init__(self, *args, **kwargs):
    user = kwargs.pop('user', None)
    super(KeywordFrom, self).__init__(*args, **kwargs)
    ...etc...
于 2013-07-16T08:41:49.090 に答える