Django/Python: 表单数据未存储在数据库中
Django/Python: form data doesn't get stored in database
Django 1.8/Python3.4
我想通过名为 "add" 的 Django 视图将 html 表单中的数据添加到我的数据库中。但是,由于某种原因,这并没有发生,我也不知道出了什么问题。大概错误出在视图的代码中,但我到底需要更改什么?
models.py
from django.db import models
from model_utils import Choices
class Entry(models.Model):
user = models.CharField(max_length=50)
title = models.CharField(max_length=200)
description = models.TextField()
due_date = models.DateField('Date')
due_time = models.TimeField('Time')
STATUS = Choices('Open', 'Done')
status = models.CharField(choices=STATUS, default=STATUS.Open, max_length=4)
def __unicode__(self):
return u"%s %s %s %s %s" % (self.user, self.title, self.description, self.expiry, self.status)
def expiry(self):
return u"%s %s" % (self.due_date, self.due_time)
我的有趣的部分 add.html
<td><input type="text" name="title"></td>
<td><input type="text" name="description"></td>
<td><input type="text" name="due_date"></td>
<td><input type="text" name="due_time"></td>
<td>
<select name="status" size="1" selected value="Open">
<option>Open</option>
<option>Done</option>
</select>
</td>
forms.py
from django import forms
from django.forms.widgets import TextInput
class EntryForm(forms.Form):
title = forms.CharField(max_length=200)
description = forms.widgets.TextInput()
due_date = forms.DateField()
due_time = forms.TimeField()
status = forms.ChoiceField(choices=[(x, x) for x in range(1, 2)])
以及我的相关视图views.py
from django import forms
from django.shortcuts import render
from django.shortcuts import redirect
from website.list.forms import EntryForm
def add(request):
if request.method == "POST":
form = EntryForm(request.POST)
if form.is_valid():
new_entry = form.save()
new_entry.save()
return redirect('website')
else:
form = EntryForm()
return render(request,'add.html', {'form': form})
感谢任何帮助!
[编辑]
所以,这就是我的 add.html 现在的样子:
<form action="." method="post">
{% csrf_token %}
{{ form }}
<br><input type="submit" value="Send"/>
<br><br><a href="{% url 'overview' %}">Cancel</a>
</form>
然后稍微编辑一下 views.py:
from django import forms
from django.shortcuts import render
from django.shortcuts import redirect
from www.todolist.forms import EntryForm
from django.contrib.auth.models import User
def add(request):
if request.method == "POST":
form = EntryForm(request.POST)
if form.is_valid())
form.save()
return redirect('website')
else:
form = EntryForm()
return render(request,'add.html', {'form': form})
我猜你在这里遇到了错误; form = EntryForm(request.POST)
但是因为您是手动写出表单 html 而不是使用 Django 表单来完成它,所以您没有看到错误。
https://docs.djangoproject.com/en/1.8/topics/forms/#the-template 是您应该如何使用 Django 为您的 Django 表单呈现 html;默认情况下,这将显示尝试验证数据时发生的任何错误。
想通了...
为了让 save() 函数在视图中工作,forms.py 必须如下所示:
class EntryForm(forms.ModelForm):
CHOICES = (
('1', 'Open'),
('2', 'Done'),
)
title = forms.CharField(max_length=200)
description = forms.CharField(widget=forms.Textarea)
due_date = forms.DateField()
due_time = forms.TimeField()
status = forms.ChoiceField(choices=CHOICES)
class Meta:
model = Entry
fields = '__all__'
需要注意的重要事项是 "ModelForm" 而不仅仅是 "Form" 和 class 元信息。
Django 1.8/Python3.4
我想通过名为 "add" 的 Django 视图将 html 表单中的数据添加到我的数据库中。但是,由于某种原因,这并没有发生,我也不知道出了什么问题。大概错误出在视图的代码中,但我到底需要更改什么?
models.py
from django.db import models
from model_utils import Choices
class Entry(models.Model):
user = models.CharField(max_length=50)
title = models.CharField(max_length=200)
description = models.TextField()
due_date = models.DateField('Date')
due_time = models.TimeField('Time')
STATUS = Choices('Open', 'Done')
status = models.CharField(choices=STATUS, default=STATUS.Open, max_length=4)
def __unicode__(self):
return u"%s %s %s %s %s" % (self.user, self.title, self.description, self.expiry, self.status)
def expiry(self):
return u"%s %s" % (self.due_date, self.due_time)
我的有趣的部分 add.html
<td><input type="text" name="title"></td>
<td><input type="text" name="description"></td>
<td><input type="text" name="due_date"></td>
<td><input type="text" name="due_time"></td>
<td>
<select name="status" size="1" selected value="Open">
<option>Open</option>
<option>Done</option>
</select>
</td>
forms.py
from django import forms
from django.forms.widgets import TextInput
class EntryForm(forms.Form):
title = forms.CharField(max_length=200)
description = forms.widgets.TextInput()
due_date = forms.DateField()
due_time = forms.TimeField()
status = forms.ChoiceField(choices=[(x, x) for x in range(1, 2)])
以及我的相关视图views.py
from django import forms
from django.shortcuts import render
from django.shortcuts import redirect
from website.list.forms import EntryForm
def add(request):
if request.method == "POST":
form = EntryForm(request.POST)
if form.is_valid():
new_entry = form.save()
new_entry.save()
return redirect('website')
else:
form = EntryForm()
return render(request,'add.html', {'form': form})
感谢任何帮助!
[编辑]
所以,这就是我的 add.html 现在的样子:
<form action="." method="post">
{% csrf_token %}
{{ form }}
<br><input type="submit" value="Send"/>
<br><br><a href="{% url 'overview' %}">Cancel</a>
</form>
然后稍微编辑一下 views.py:
from django import forms
from django.shortcuts import render
from django.shortcuts import redirect
from www.todolist.forms import EntryForm
from django.contrib.auth.models import User
def add(request):
if request.method == "POST":
form = EntryForm(request.POST)
if form.is_valid())
form.save()
return redirect('website')
else:
form = EntryForm()
return render(request,'add.html', {'form': form})
我猜你在这里遇到了错误; form = EntryForm(request.POST)
但是因为您是手动写出表单 html 而不是使用 Django 表单来完成它,所以您没有看到错误。
https://docs.djangoproject.com/en/1.8/topics/forms/#the-template 是您应该如何使用 Django 为您的 Django 表单呈现 html;默认情况下,这将显示尝试验证数据时发生的任何错误。
想通了... 为了让 save() 函数在视图中工作,forms.py 必须如下所示:
class EntryForm(forms.ModelForm):
CHOICES = (
('1', 'Open'),
('2', 'Done'),
)
title = forms.CharField(max_length=200)
description = forms.CharField(widget=forms.Textarea)
due_date = forms.DateField()
due_time = forms.TimeField()
status = forms.ChoiceField(choices=CHOICES)
class Meta:
model = Entry
fields = '__all__'
需要注意的重要事项是 "ModelForm" 而不仅仅是 "Form" 和 class 元信息。