更正代码示例2017年12月27日我使用的是Django 1.11和Python 2.7.13。我使用Cloud SQL (MySQL 5.7)在Google App Engine上部署,但在我本地的开发环境中出现错误。
我有一个非常简单的应用程序与一个表单,收集一些数据,并尝试将其保存为数据库中的新记录。如果我像这样使用默认表单和CreateView,它工作得很好:
# views.py
class SubjectCreate(CreateView):
model = Subject
fields = '__all__'
success_url = reverse_lazy('subapp:index')
但是,我想自定义表单(移动字段、使用复选框等)要做到这一点,我不能使用默认的CreateView,而必须编写自己的use。下面是我所做的:
# 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文档,Stack Overflow帖子和Google在这上面绞尽脑汁了好几个星期。我什么也得不到。请帮帮忙?
发布于 2017-12-29 01:27:22
我最初的帖子有复制/粘贴错误,这让我看起来像是把主题和咨询搞混了。感谢那些指出这一点的人,但这不是我的问题。
基于@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=一起使用哪些字段。我还使用widgets={...}指定了一个自定义小部件。
那么模板表单就很简单了。
我不知道这是不是最好的,甚至是“正确”的方式,但它是有效的。
非常感谢!
发布于 2017-12-27 01:20:00
class NewSubjectForm(ModelForm):
class Meta:
model = Subject
fields = '__all__'
模型必须是Subject
而不是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})
或
views.py
class SubjectCreate(CreateView):
form_class = NewSubjectForm
template_name = 'create.html'
success_url = reverse_lazy('subapp:index')
https://stackoverflow.com/questions/47984690
复制相似问题