在 Django 1.6 中编辑表单
Edit form in Django 1.6
我正在尝试使用 "edit" 按钮编辑模型表单,但表单未更新。我有一个视图函数,最初用于 posting 并保存一个新的 post。然后我有第二个函数 edit_comment
,用于更新在原始文件中创建的对象 one_entry
。在我的模板中,我有一个用于提交 posts 的表单和一个连接到 url“/edit”的 "edit" 按钮,用于使用 [= 更新表单中添加的 one_entry
对象30=]“/条目”。非常感谢任何帮助。
观看次数
# function for adding a new post
def original(request, postID):
one_entry = Entry.objects.get(id=postID)
if request.method == 'POST':
form = ReplyForm(request.POST)
if form.is_valid():
postOneComment(request, one_entry)
else:
form = ReplyForm()
c = {"one_entry":one_entry,"form":form,"comment_views":comment_views}
c.update(csrf(request))
return render(request,"template.html", c)
# function for editing/updating the object one_entry
# Comment is a model and content and title are fields in the Modelform
# that should be updated
def edit_comment(request, one_entry):
content = Comment.objects.get(pk=one_entry)
title = Comment.objects.get(pk=one_entry)
if request.method == 'POST':
form = ReplyForm(request.POST, instance=content)
form = ReplyForm(request.POST, instance=title)
if form.is_valid():
postOneComment(request, one_entry)
else:
form = ReplyForm()
c = {"form":form,"one_entry":one_entry}
c.update(csrf(request))
return render(request,"template.html", c)
def postOneComment(request, one_entry):
content = request.POST["content"]
title = request.POST["title"]
user= request.user.username
entryComment = Comment(datetime=datetime.datetime.now(), belongsTo=one_entry,content=content, title=title, user=user)
entryComment.save()
形式
class ReplyForm(forms.ModelForm):
title = forms.CharField(max_length=70)
content = forms.CharField(widget=forms.Textarea)
class Meta:
model = Comment
fields = ("title","content", "user")
在url秒
# url for adding a post to object one_entry
url(r'^entry(?P<postID>\d+)$', original),
# url for editing/updating one_entry
url(r'^edit(?P<one_entry>\d+)$',edit_comment),
在模板中
#button for editing one_entry
{% for t in one_entry.comment_set.all %}
<a type="button" href="/edit{{ t.id}}" class="btn btn-xs btn-success">EDIT</button></a>
#form for adding a new post
<form method="post" action="">{% csrf_token %}
<center>Titel (optional){{ form.title}}</center></br>
<center>{{ form.content}}</center>
<center><button type="submit" class="btn btn-success">POST</button></center>
</form>
所以这里至少有三个问题。
首先,正如我所说,您对 form
变量的重复实例化是没有意义的;就好像您根本没有做过第一个。所以不要。
其次,我不明白postOneComment
的意义何在。您已经仔细定义了一个表单并使用实例对其进行了实例化,现在您已经定义了一个单独的函数,该函数完全忽略该表单并直接从 POST 中保存评论。事实上,这段代码实际上不起作用,因为您试图将 用户名 字符串作为 user
参数而不是实际用户传递。
第三,您遇到的实际问题是您的表单无效。然而,你没有在模板上显示错误,所以你看不到它们 - 而且你也没有在成功 post 后重定向到另一个 URL,所以你没有办法判断 post 是否成功。
您的表单无效的原因是您在表单中明确包含了 user
参数,但没有在模板中提供它。所以那个表格永远不会有效。显然您想自动设置它,因此将其从 fields
.
中删除
所以,总结一下:
- 从表单字段中删除
user
;
- 将
{{ form.errors }}
添加到您的模板;
- 将您的视图代码替换为:
.
def edit_comment(request, one_entry):
content = Comment.objects.get(pk=one_entry)
if request.method == 'POST':
form = ReplyForm(request.POST, instance=content)
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user
comment.save()
return redirect('/') # or wherever you want
else:
form = ReplyForm()
c = {"form":form,"one_entry": content}
return render(request,"template.html", c)
我正在尝试使用 "edit" 按钮编辑模型表单,但表单未更新。我有一个视图函数,最初用于 posting 并保存一个新的 post。然后我有第二个函数 edit_comment
,用于更新在原始文件中创建的对象 one_entry
。在我的模板中,我有一个用于提交 posts 的表单和一个连接到 url“/edit”的 "edit" 按钮,用于使用 [= 更新表单中添加的 one_entry
对象30=]“/条目”。非常感谢任何帮助。
观看次数
# function for adding a new post
def original(request, postID):
one_entry = Entry.objects.get(id=postID)
if request.method == 'POST':
form = ReplyForm(request.POST)
if form.is_valid():
postOneComment(request, one_entry)
else:
form = ReplyForm()
c = {"one_entry":one_entry,"form":form,"comment_views":comment_views}
c.update(csrf(request))
return render(request,"template.html", c)
# function for editing/updating the object one_entry
# Comment is a model and content and title are fields in the Modelform
# that should be updated
def edit_comment(request, one_entry):
content = Comment.objects.get(pk=one_entry)
title = Comment.objects.get(pk=one_entry)
if request.method == 'POST':
form = ReplyForm(request.POST, instance=content)
form = ReplyForm(request.POST, instance=title)
if form.is_valid():
postOneComment(request, one_entry)
else:
form = ReplyForm()
c = {"form":form,"one_entry":one_entry}
c.update(csrf(request))
return render(request,"template.html", c)
def postOneComment(request, one_entry):
content = request.POST["content"]
title = request.POST["title"]
user= request.user.username
entryComment = Comment(datetime=datetime.datetime.now(), belongsTo=one_entry,content=content, title=title, user=user)
entryComment.save()
形式
class ReplyForm(forms.ModelForm):
title = forms.CharField(max_length=70)
content = forms.CharField(widget=forms.Textarea)
class Meta:
model = Comment
fields = ("title","content", "user")
在url秒
# url for adding a post to object one_entry
url(r'^entry(?P<postID>\d+)$', original),
# url for editing/updating one_entry
url(r'^edit(?P<one_entry>\d+)$',edit_comment),
在模板中
#button for editing one_entry
{% for t in one_entry.comment_set.all %}
<a type="button" href="/edit{{ t.id}}" class="btn btn-xs btn-success">EDIT</button></a>
#form for adding a new post
<form method="post" action="">{% csrf_token %}
<center>Titel (optional){{ form.title}}</center></br>
<center>{{ form.content}}</center>
<center><button type="submit" class="btn btn-success">POST</button></center>
</form>
所以这里至少有三个问题。
首先,正如我所说,您对 form
变量的重复实例化是没有意义的;就好像您根本没有做过第一个。所以不要。
其次,我不明白postOneComment
的意义何在。您已经仔细定义了一个表单并使用实例对其进行了实例化,现在您已经定义了一个单独的函数,该函数完全忽略该表单并直接从 POST 中保存评论。事实上,这段代码实际上不起作用,因为您试图将 用户名 字符串作为 user
参数而不是实际用户传递。
第三,您遇到的实际问题是您的表单无效。然而,你没有在模板上显示错误,所以你看不到它们 - 而且你也没有在成功 post 后重定向到另一个 URL,所以你没有办法判断 post 是否成功。
您的表单无效的原因是您在表单中明确包含了 user
参数,但没有在模板中提供它。所以那个表格永远不会有效。显然您想自动设置它,因此将其从 fields
.
所以,总结一下:
- 从表单字段中删除
user
; - 将
{{ form.errors }}
添加到您的模板; - 将您的视图代码替换为:
.
def edit_comment(request, one_entry):
content = Comment.objects.get(pk=one_entry)
if request.method == 'POST':
form = ReplyForm(request.POST, instance=content)
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user
comment.save()
return redirect('/') # or wherever you want
else:
form = ReplyForm()
c = {"form":form,"one_entry": content}
return render(request,"template.html", c)