Django保存新记录,int()参数必须是字符串或数字,而不是' QueryDict'

时间:2017-12-26 23:18:02

标签: python django

代码示例已于2017年12月27日更正 我使用的是Django 1.11和Python 2.7.13。我使用Cloud SQL(MySQL 5.7)在Google App Engine上部署,但错误发生在我的本地开发环境中。

我有一个非常简单的应用程序,其中包含1个表单,用于收集一些数据并尝试将其保存为数据库中的新记录。如果我使用默认表单和CreateView,它可以正常工作:

# views.py
class SubjectCreate(CreateView):
    model = Subject
    fields = '__all__'
    success_url = reverse_lazy('subapp:index')

但是,我想自定义表单(移动字段,使用复选框等)。从我可以告诉我无法使用默认的CreateView等,但必须自己编写。所以,这就是我所做的:

# models.py
class Subject(models.Model):
    subject_date = models.DateTimeField(default=timezone.now)
    subject_field2 = models.CharField(max_length=20)
    ... whole bunch of other fields ...

    def __str__(self):
        return self.subject_date.strftime('%Y-%m-%d %H:%M') + 
                self.subject_field2[:35] + "..."


#views.py
def createnewsubject(request):
    if request.method == 'POST':
        subject_form = NewSubjectForm(request.POST)
        if subject_form.is_valid():
            subject_data = Subject(request.POST)
            subject_data.save()
            return HttpResponseRedirect('/')
    else:
        subject_form = NewSubjectForm()
    return render(request, 'subapp/subject_form.html',
            {'form': subject_form})


# forms.py
class NewSubjectForm(forms.ModelForm):
    class Meta:
        model = Subject
        fields = "__all__"

当代码命中subject_data.save()时,我得到了

TypeError at /new/
int() argument must be a string or a number, not 'QueryDict'

当我查看跟踪时,我看到了

self    <django.db.models.fields.AutoField: id>

value   <QueryDict: { ... dict with all my app data ... }>

所以听起来Django正试图将我的表单数据用作新记录的主键。但主键应该是自动生成的。

使用Django doc,Stack Overflow帖子和Google,我已经打了好几个星期。我无处可去。请帮帮忙?

2 个答案:

答案 0 :(得分:0)

PUT

模型必须为class NewSubjectForm(ModelForm): class Meta: model = Subject fields = '__all__' 而不是Subject

views.py

Consultation

views.py

def createnewsubject(request):
    if request.method == 'POST':
        subject_form = NewSubjectForm(request.POST)
        if subject_form.is_valid():
            subject_data = subject_form.save()
            return HttpResponseRedirect('/')
        else:
            return HttpResponse(subject_form.errors.as_text())
    else:
        subject_form = NewSubjectForm()
    return render(request, 'subapp/subject_form.html',
            {'form': consultation_form})

答案 1 :(得分:0)

我原来的帖子有复制/粘贴错误,看起来我把主题与咨询混淆了。感谢那些指出这一点的人,但这不是我的问题。

根据@Daniel Roseman的评论,我得到了这个工作:

#models.py
class Subject(models.Model):
    subject_date = models.DateTimeField(default=timezone.now)
    subject_field2 = models.CharField(max_length=20)
    ... whole bunch of other fields ...



#views.py
class SubjectCreate(CreateView):
    model = Subject
    form_class = NewSubjectForm
    success_url = reverse_lazy('subapp:index')



#forms.py
class NewSubjectForm(forms.ModelForm):
    class Meta:
        model = Subject
        fields = ['subject_date', 'subject_field2', ... ]
        widgets = {'subject_field2': forms.RadioSelect()}



#subject_form.html
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'subapp/style.css' %}" />
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
<br>
</table>
<input type="submit" value="Submit" />
</form>

我使用标准的CreateView类来定义视图。我使用form_class告诉CreateView要使用哪个表单。

在我使用ModelForm的形式中,我告诉它使用fields = [...]的字段。我还使用小部件= {...}指定了一个自定义小部件。

然后模板表单很简单。

我不知道这是否是最好的,甚至是#34;权利&#34;这样做的方法,但它的确有效。

非常感谢!