2013-03-04 3 views
2

Я работаю над простым приложением, которое действует подобно википедии, используя учебник «Создайте вики через 20 минут» из showmedo.Страница 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? –

+0

http://tafe.pythonanywhere.com/wikicamp/Dogs/ Попробуйте. :] – donkeyboy72

+0

Я немного запутался в ваших кодах. В вашем файле edit.html сохраните его, чтобы сохранить url вместо этого в URL-адресе редактирования. – catherine

ответ

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, а во-вторых, после того, как вы успешно загрузили страницу и обновили ее содержимое, вы забудете ее сохранить.

Поскольку это общий шаблон, есть ярлык в Джанго 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 переменную:

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

Спасибо. Я буду использовать эти ярлыки в моих дальнейших проектах – donkeyboy72

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 + "/") 

Это быстрый некрасиво исправить, я рекомендую смотреть в forms и class based views.

+0

это правильно – catherine

+0

@msc Большое спасибо. В следующий раз я посмотрю подробнее. – donkeyboy72

+0

Это не сработает, потому что вы проверяете значение 'pk' на' page_name', когда вы должны проверять 'имя'. –

1

Две вещи, которые я заметил с этим:

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

1) в try блоке вы запрашиваете на pk и в except вы установив 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 + "/") 
Смежные вопросы