2013-03-04 63 views
2

我正在使用showmedo的教程「在20分鐘內創建一個wiki」的類似於維基百科的簡單應用程序。Django頁面不保存

該應用程序的作品由你創建一個頁面例如狗,如果它不存在,那麼你添加所有關於狗的信息,它顯示狗的狗和細節。 enter image description here

當我嘗試編輯相同的頁面。該頁面不會在主頁面上更新,或者在我的管理頁面上更新。 enter image description here

我覺得問題出在我的save_page函數和edit_page函數上。 所以當我創建一個頁面,它的工作原理 ,但是當我嘗試檢索頁面並保存它。它不保存。

唯一可行的方法是通過管理員編輯頁面。

我認爲這個問題是在這裏

def save_page(request, page_name): 
    content = request.POST.get('content', 'this is the default') 
    try: 
     page = Page.objects.get(pk=page_name) 
     page.content = content 

這是網站 http://tafe.pythonanywhere.com/wikicamp/Dogs/

我views.py

from wiki.models import Page 
from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from django.template import RequestContext 
def view_page(request,page_name): 
    try: 
     page = Page.objects.get(pk=page_name) 
    except Page.DoesNotExist: 
     return render_to_response("create.html",{"page_name":page_name}) 
    content = page.content 
    return render_to_response("view.html",{"page_name":page_name , "content":content}, context_instance=RequestContext(request)) 
def edit_page(request,page_name): 
    try: 
     page = Page.objects.get(pk=page_name) 
     content = page.content 
    except Page.DoesNotExist: 
     content = "" 
    return render_to_response("edit.html",{"page_name":page_name, "content":content}, context_instance=RequestContext(request)) 
def save_page(request, page_name): 
    content = request.POST.get('content', 'this is the default') 
    try: 
     page = Page.objects.get(pk=page_name) 
     page.content = content 
    except Page.DoesNotExist: 
     page = Page(name=page_name, content=content) 
     page.save() 
    return HttpResponseRedirect("/wikicamp/" + page_name + "/") 

我create.html上

<html> 
    <head> 
     <title>{{page.name}} - Create </title> 
    </head> 
    <body> 
     <h1>{{page_name}} </h1> 
     This page does not exist. <a href="{% url wiki:edit page_name %}">Create?  </a> 
</body> 
</html> 

我edit.html

 <html> 
    <head> 
     <title>{{page_name - Editing</title> 
    </head> 
    <body> 
     <h1>Editing {{page_name}} </h1> 
     <form method = "post" action="{% url wiki:save page_name %}"> {% csrf_token %} 
       <textarea name="content" rows="20" cols="60">  {{content}} 
     </textarea><br/>  
      <input type="submit" value="Save Page"/> 
      </form> 
     </body> 
     </html> 

我view.html

<html> 
    <head> 
    <title>{{page_name}}</title> 
     </head> 
    <body> 
     <h1>{{page_name}} </h1> 
     {{content}} 
     <hr/> 
     <a href="{% url wiki:edit page_name %}">Edit this page ?</a> 
    </body> 
</html> 
+0

的Internet Explorer? – 2013-03-04 04:11:55

+0

http://tafe.pythonanywhere.com/wikicamp/Dogs/試用一下。 :] – donkeyboy72 2013-03-04 04:15:25

+0

我對你的代碼有點困惑。在您的edit.html中保存它以保存url而不是編輯網址 – catherine 2013-03-04 04:15:39

回答

1
try: 
    page = Page.objects.get(pk=page_name) 
    page.content = content 
except Page.DoesNotExist: 
    page = Page(name=page_name, content=content) 
    page.save() 

我在這裏看到兩個問題。首先,您試圖通過page_name作爲主鍵來檢索頁面,當您應該在name屬性上進行搜索時,其次在您成功獲取頁面並更新其內容後,忘記保存該頁面。

由於這是一個常見的模式,有在Django get_or_create一個快捷方式,它的工作原理是這樣的:

page, created = Page.objects.get_or_create(name=page_name) 
if created: 
    # new page was created 
else: 
    # existing page was retrieved 

在你的情況下,你只是想獲取和更新在這兩種情況下的內容。所以我們並不需要使用created變量:在try塊你被pk並在except你查詢

try: 
    page = Page.objects.get(pk=page_name) 
    page.content = content 
except Page.DoesNotExist: 
    page = Page(name=page_name, content=content) 
    page.save() 

1):

page, created = Page.objects.get_or_create(name=page_name) 
page.content = content 
page.save() 
+0

謝謝。我將在我的更多項目中使用這個快捷方式 – donkeyboy72 2013-03-04 04:45:36

1

你不保存在save_page頁面,只有當它不存在。嘗試是這樣的:

def save_page(request, page_name): 
    content = request.POST.get('content', 'this is the default') 
    try: 
     page = Page.objects.get(pk=page_name) 
     page.content = content 
     page.save() 
    except Page.DoesNotExist: 
     page = Page(name=page_name, content=content) 
     page.save() 
    return HttpResponseRedirect("/wikicamp/" + page_name + "/") 

這是一個快速醜陋修復,我建議考慮formsclass based views

+0

這是正確的 – catherine 2013-03-04 04:32:15

+0

@msc非常感謝。我將在下一次看到更詳細的信息 – donkeyboy72 2013-03-04 04:42:08

+0

這是行不通的,因爲當您應該檢查'name'時,您正在檢查'page_name'的'pk'值。 – 2013-03-04 04:58:02

1

兩件事情,我注意到這個設置name

2)您沒有保存在try區塊中。

試試這個:

try: 
    page = Page.objects.get(name=page_name) 
except Page.DoesNotExist: 
    page = Page(name=page_name) 
page.content = content 
page.save() 
1

你忘了保存()

def save_page(request, page_name): 
    content = request.POST.get('content', 'this is the default') 
    try: 
     page = Page.objects.get(pk=page_name) 
     page.content = content 
     page.save() 
    except Page.DoesNotExist: 
     page = Page(name=page_name, content=content) 
     page.save() 
    return HttpResponseRedirect("/wikicamp/" + page_name + "/")