如何在django中编辑modelform

时间:2014-02-25 14:52:47

标签: django django-forms

'Contact'是模型,'ContactForm'是模型形式

urls.py

(r'^contact/edit/(?P<p_id>\d+)$',edit_contact_page),

views.py

def edit_contact_page(request,p_id):
    if request.method == 'POST':
        form = ContactForm(request.POST,instance=obj)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/contact/success')
    else:  
        obj=Contact.objects.get(pk=p_id)
        form=ContactForm(instance=obj)
        variables = RequestContext(request, {'form': form})
        return render_to_response('registration/edit_contact.html',variables)


#edit_contact.html
<form method="post" action="/contact/success/"  class="form-signin">
    {% csrf_token %}
    {{ form.name.errors }}
    <label>Name</label>
    {{ form.name }}
    <br>
     {{ form.email.errors }}
    <label>Email</label>
    {{ form.email }}
    <br>
     {{ form.msg.errors }}
    <label>Message</label>
    {{ form.msg }}
    <br>
    {{ form.phone.errors }}
    <label>Phone</label>
    {{ form.phone }}
    <button class="btn btn-large btn-primary" type="submit">Save</button>
</form>

else part get instance well(有界形式),但post方法既不保存模型中的形式也不给出验证错误。

请求重定向到sucess.html模板。

4 个答案:

答案 0 :(得分:0)

删除commit = False。你告诉django不要提交你的更改。我不相信obj存在于你的post方法if语句中。它只存在于你的else语句中。

答案 1 :(得分:0)

您还需要将最后两行返回到一个缩进级别,因此它们将在表单发布但无效时执行。

答案 2 :(得分:0)

您的表单正在提交/contact/success(这就是加载该页面的原因),但是从未创建新联系人,因为您的查看方法的网址/contact/edit/未被调用。

您需要修复表单网址。

答案 3 :(得分:0)

Contact instance should be placed at top

indent last two lines of views.py

def edit_contact_page(request,p_id):

     obj=Contact.objects.get(pk=p_id)
     if request.method == 'POST':
         form = ContactForm(request.POST,instance=obj)
         if form.is_valid():
             form.save()
             return HttpResponseRedirect('/contact/success')
     else :
         form=ContactForm(instance=obj)
     variables = RequestContext(request, {'form': form, 'p_id': p_id})
     return render_to_response('registration/edit_contact.html',variables)

form url
<form method="post" action="/contact/edit/{{p_id}}"  class="form-signin">