2

showmedo のチュートリアル「20分でウィキを作成する」を使用して、ウィキペディアと同様に機能するシンプルなアプリに取り組んでいます。

このアプリは、たとえば犬が存在しない場合は犬のページを作成し、犬に関するすべての情報を追加すると、犬と犬の詳細が表示されます。ここに画像の説明を入力

同じページを編集しようとすると。ページはメイン ページで更新されず、管理ページでも更新されます。 ここに画像の説明を入力

問題は 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>
4

4 に答える 4

1

save() を入れるのを忘れた

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 + "/")
于 2013-03-04T04:35:28.043 に答える
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 + "/")

これは簡単な醜い修正です。フォームクラスベースのビューを調べることをお勧めします。

于 2013-03-04T04:20:56.407 に答える
1
 try:
     page = Page.objects.get(pk=page_name)
     page.content = content
 except Page.DoesNotExist:
     page = Page(name=page_name, content=content)
     page.save()

ここに 2 つの問題があります。page_nameまず、属性を検索する必要があるときに、主キーとしてページを取得しようとしてnameいます。次に、ページを正常にフェッチしてそのコンテンツを更新した後、ページを保存するのを忘れています。

これは一般的なパターンであるため、 djangoget_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()
于 2013-03-04T04:21:09.300 に答える
1

これで気づいた2つのこと:

 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.

try2)ブロックに保存していません。

これを試して:

 try:
     page = Page.objects.get(name=page_name)
 except Page.DoesNotExist:
     page = Page(name=page_name)
 page.content = content
 page.save()
于 2013-03-04T04:23:06.143 に答える