在 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)