代码示例已于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,我已经打了好几个星期。我无处可去。请帮帮忙?
答案 0 :(得分:0)
PUT
模型必须为class NewSubjectForm(ModelForm):
class Meta:
model = Subject
fields = '__all__'
而不是Subject
,
Consultation
或
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;这样做的方法,但它的确有效。
非常感谢!