1

まず第一に、私はここに来てよかったです。最近あなたのことを読み、ここで役立つ答えを見つけました。
これは私の最初の投稿ですので、親切に教えてください、私はプログラミングの初心者です。

だから、私はDjangoで最初のWebアプリケーションを書いています.todoアプリですが、これを行う関数を書く方法がわかりません。Django ドキュメントやその他の関連するディスカッションで何かを見つけましたが、機能しません。

これが私のコードです:

#models.py

class Task(models.Model):
user = models.ForeignKey(User)
task = models.CharField(max_length=200)
initialized_at = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(default=datetime.now)
done = models.BooleanField(default=False)

def __unicode__(self):
    return self.task

#views.py
def edit_task(request, id):
if request.method == 'POST':
    task_to_edit = Task.objects.get(pk=task_id)
    form = TaskForm(request.POST, instance=task_to_edit)
    form.save()
    if form.is_valid():
        task_to_edit = form.save()
    return HttpResponseRedirect('/')
else:
    form = TaskForm()
return render(request, 'todo/edit_task.html', {'form': form})

#urls.py
url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task')

#edit_task.html
{% block content %}
<form action="/edit_task/" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}

更新されたフォームを送信すると、次のエラーが表示されます。

Page not found (404)
Request Method:     POST
Request URL:    hxxp://127.0.0.1:8000/edit_task/

jbz.urls で定義された URLconf を使用して、Django は次の URL パターンを次の順序で試しました。

^admin/
^$ [name='index']
^(?P<task_id>\d+)/$
^(?P<task_id>\d+)/$
^add-task/$
^delete-task/(?P<task_id>\w+)/$
^edit_task/(?P<id>\w+)/$
^done/(?P<task_id>\d*)/$

現在の URL はedit_task/、これらのいずれとも一致しませんでした。

ルート urls.py は次のようになります。

url(r'', include('todo.urls'))
4

3 に答える 3

1
#edit_task.html
{% block content %}
<form action="/edit_task/{{task.id}}" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}

{{task.id}}式を追加した方法に注目してください<form action="/edit_task/{{task.id}}" method="post">

重要な注意:テンプレート{{task.id}}でこれを実現する任意の変数に置き換えます。

エラーが発生する理由は、正規表現に一致するedit_task/他の部分を取得していないためです。task_id

url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task')

更新:また、edit_taskビューにも潜在的なエラーがあります>

def edit_task(request, id):
    task_to_edit = Task.objects.get(pk=id)
    if request.method == 'POST':
        form = TaskForm(request.POST, instance=task_to_edit)
        form.save()
        if form.is_valid():
            task_to_edit = form.save()
        return HttpResponseRedirect('/')
else:
    form = TaskForm(instance=task_to_edit)
# you don't pass any task variable to the view so the form view
# won't know which task to edit, you'll have to handle that
return render(request, 'todo/edit_task.html', {'form': form, 'task':task_to_edit})

注:ビューのコードを少し修正しました。task_to_editを介してビューが要求されたときにフィールドに入力するために、 も Form に渡されるようになりましたGET。このビューにアクセスするには、ブラウザの URL が次のようになっている必要があります。http://www.example.com/edit_task/2

http://www.example.com/edit_taskID を渡さずにアクセスしようとすると、エラー 404が返されます。

お役に立てれば!

于 2013-06-06T16:28:58.167 に答える
0

名前空間を URL に追加し、それに応じてテンプレートを更新するだけです。

#urls.py
url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task', name= "edit_task")

#edit_task.html
{% block content %}
<form action="{% url 'edit_task' task_id %}" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}
于 2013-06-06T18:46:44.837 に答える