2012-05-25 14 views
0

我使用代碼找到here(SO.com)使用相同的模板來添加和編輯記錄,但是當我添加新記錄並單擊提交,我在網址http://192.168.1.3:5678/app/student/edit/None/上收到404,我不確定爲什麼。添加表單返回無作爲記錄ID,導致URL錯誤

這裏是我的urls.py的相關部分:

url(r'^app/lesson/new/$', 'edit_lesson', {}, 'lesson_new'), 
url(r'^app/lesson/edit/(?P<id>\d+)/$', 'edit_lesson', {}, 'lesson_edit'), 

這裏是我的views.py的相關部分:

def edit_lesson(request, id=None, template_name='lesson_edit_template.html'): 
if id: 
    t = "Edit" 
    lesson = get_object_or_404(Lesson, pk=id) 
    stu = get_object_or_404(Student, pk=sid) 
    if stu.teacher != request.user: 
     raise HttpResponseForbidden() 
else: 
    t = "Add" 
    lesson = Lesson() 

    if request.POST: 
     form = LessonForm(request.POST, instance=lesson) 
     if form.is_valid(): 
      form.save() 

      # If the save was successful, redirect to another page 
      return view_lessons(request) 

    else: 
     form = LessonForm(instance=lesson) 

    return render_to_response(template_name, { 
     'form': form, 
     't': t, 
     'lesson': lesson, 
      }, context_instance=RequestContext(request)) 

最後,這裏是我的模板:

<h1>{{ t }} Lesson</h1> 
<form action="/app/lesson/edit/{{ lesson.id }}/" method="post"> {% csrf_token %} 
{{ form.as_p }} 
<input type="submit" value="Submit" /> 
</form> 

我確定我錯過了一件非常簡單的事情,但我不能似乎把我的手指。如果這有什麼不同,我使用Django 1.3.1。

感謝, MC

回答

1

沒有必要在表單的action屬性中指定任何URL。只要做

<form action="" method="post"> 

它會回發到您最初用來訪問它的URL,這是你想要的。

0

加的情況下{{ lesson.id }}是沒有的,因爲lesson未保存Lesson()實例,不PK,讓你的形式被解僱不存在的URL。

我建議分離創建和編輯視圖並以不同的方式處理它們(或者甚至繼承通用視圖 - 使用新的基於類的通用視圖很容易和愉快)。

另外,還可以使用{% url %}模板標籤來代替硬編碼的網址。

+0

請不要分開添加和編輯視圖,除非您有充分的理由這麼做。需要自定義表單的動作*不是一個很好的理由,因爲您可以將其留爲空白,因爲@DanielRoseman解釋說只需執行回發。 –

+0

這不僅僅是表單操作。在topicstarter的代碼中,有不同的處理程序,用'if id:...'來編輯和添加案例。在視圖中設置了活動頁面標題!是的,他應該爲POST處理重複一些東西來單獨添加和編輯,但是對於通用視圖,所有這些東西都會消失。 – ilvar

相關問題