首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django正在保存新记录,int()参数必须是字符串或数字,而不是'QueryDict‘

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

Stack Overflow用户
提问于 2017-12-26 23:18:02
回答 2查看 43关注 0票数 0

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

我有一个非常简单的应用程序与一个表单,收集一些数据,并尝试将其保存为数据库中的新记录。如果我像这样使用默认表单和CreateView,它工作得很好:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# views.py
class SubjectCreate(CreateView):
    model = Subject
    fields = '__all__'
    success_url = reverse_lazy('subapp:index')

但是,我想自定义表单(移动字段、使用复选框等)要做到这一点,我不能使用默认的CreateView,而必须编写自己的use。下面是我所做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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()时,我得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TypeError at /new/
int() argument must be a string or a number, not 'QueryDict'

当我看着痕迹时,我看到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self    <django.db.models.fields.AutoField: id>

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

因此,听起来Django试图使用我的表单数据作为新记录的主键。但是应该自动生成主键。

我已经用Django文档,Stack Overflow帖子和Google在这上面绞尽脑汁了好几个星期。我什么也得不到。请帮帮忙?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-29 01:27:22

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

基于@Daniel Roseman的评论,我得到了这样的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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=一起使用哪些字段。我还使用widgets={...}指定了一个自定义小部件。

那么模板表单就很简单了。

我不知道这是不是最好的,甚至是“正确”的方式,但它是有效的。

非常感谢!

票数 0
EN

Stack Overflow用户

发布于 2017-12-27 01:20:00

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class NewSubjectForm(ModelForm):
    class Meta:
        model = Subject
        fields = '__all__'

模型必须是Subject而不是Consultation

views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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})

views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SubjectCreate(CreateView):
    form_class = NewSubjectForm
    template_name = 'create.html'
    success_url = reverse_lazy('subapp:index')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47984690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文