0

我有一个显示表单并保存相同表单的视图。首次显示视图时,我没有错误。但是,当保存(发布)到视图时,我收到以下错误:

/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 回答