Pie*_*NAY 4 django django-forms
模型:
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
status = models.CharField(max_length=1)
Run Code Online (Sandbox Code Playgroud)
形式:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor']
Run Code Online (Sandbox Code Playgroud)
测试:
>>> ses = Session.objects.get(pk=1)
>>> ses
<Session: Robert - 2012-04-18 13:00:00>
>>> form = SessionForm(instance=ses)
Run Code Online (Sandbox Code Playgroud)
例如,现在我只想更新status此实例的并保存它。
我怎样才能做到这一点 ?
编辑
模板:
<form action="fhjsdhkl" method="POST">{{ csrf_token }}
<input name="start_time" />
<input name="end_time" />
</form>
Run Code Online (Sandbox Code Playgroud)
尝试仅发布这两个字段:
if request.method == 'POST':
form = SessionForm(request.POST)
if request.POST['id']:
try:
s = Session.objects.get(pk=request.POST['id'])
form.instance = s
except Session.DoesNotExist:
pass
if form.is_valid():
form.save()
Run Code Online (Sandbox Code Playgroud)
无法更改会话,因为数据未验证。
表单返回的错误是
状态 - 此字段为必填项
我需要更新的字段不是固定的,我想避免每次都发布所有字段。我是否必须为每种情况制作不同的表格?
编辑2:旧答案无关紧要
if request.method == 'POST':
form = SessionForm(request.POST)
if request.POST['id']:
try:
s = Session.objects.get(pk=request.POST['id'])
form.instance = s
except Session.DoesNotExist:
pass
if form.is_valid():
form.save()
Run Code Online (Sandbox Code Playgroud)
好吧,这里发生了很多事情:
1.
这行应该是这样的:
form = SessionForm(request.POST, instance = s)
Run Code Online (Sandbox Code Playgroud)
2.
您应该向上移动会话对象:
if request.method == 'POST':
s = get_object_or_404(Session, pk=request.POST['id'])
form = SessionForm(request.POST, instance = s)
Run Code Online (Sandbox Code Playgroud)
如果执行下面的 try 和 except 方法,只要该对象不存在,就会引发验证错误。相反,抛出 404。文档位于上述快捷方式上:https://docs.djangoproject.com/en/1.0/topics/http/shortcuts/#get-object-or-404如果尚未导入,则需要导入它。
现在您可以评估它并保存它:
if request.method == 'POST':
s = get_object_or_404(Session, pk=request.POST['id'])
form = SessionForm(request.POST, instance = s)
if form.is_valid():
form.save()
Run Code Online (Sandbox Code Playgroud)
3.
此外,您不应该这样做:如果 request.POST['id'] 作为字符串永远不会为 False,即使是空字符串。例如,在 IDLE 中尝试以下操作:
>>> '' == True
>>> '' == False
>>> 'a' == True
>>> 'a' == False
Run Code Online (Sandbox Code Playgroud)
您会注意到它的计算结果始终为 False。
因此,您所看到的实际上从未创建参考模型。