2011-07-19 155 views
0

我有一個視圖功能,允許用戶添加/編輯/刪除一個對象。以下功能如何顯示,以及我可以通過哪些方式改進它?我正在考慮將函數的各個方面分成不同的部分,但由於沒有「組件」的代碼超過四五行,我認爲這會有點矯枉過正。評估添加/編輯視圖功能

@login_required 
def edit_education(request, edit=0): 
    profile = request.user.get_profile() 
    education = profile.education_set.order_by('-class_year') 
    form = EducationForm(data=request.POST or None, request=request) 

    if request.method == 'POST': 

     ##### to add a new school entry ###### 
     if 'add_school' in request.POST: 
      if form.is_valid(): 
       new_education = form.save(commit=False) 
       new_education.user = profile 
       new_education.save() 
       return redirect('edit_education') 

     ##### to delete a school entry ##### 
     for education_id in [key[7:] for key, value in request.POST.iteritems() if key.startswith('delete')]: 
      Education.objects.get(id=education_id).delete() 
      return redirect('edit_education') 

     ###### to edit a school entry -- essentially, re-renders the page passing an "edit" variable ##### 
     for education_id in [key[5:] for key, value in request.POST.iteritems() if key.startswith('edit')]: 
      edit = 1 
      school_object = Education.objects.get(id = education_id) 
      form = EducationForm(instance = school_object, request=request) 
      return render(request, 'userprofile/edit_education.html', 
         {'form': form, 
         'education':education, 
         'edit': 1, 
         'education_id': education_id} 
        ) 
     ##### to save changes after you edit a previously-added school entry ###### 
     if 'save_changes' in request.POST: 
      instance = Education.objects.get(id=request.POST['education_id']) 
      form = EducationForm(data = request.POST, instance=instance, request=request, edit=1) 
      if form.is_valid(): 
       form.save() 
       return redirect('edit_education') 

return render(request, 'userprofile/edit_education.html', {'form': form, 'education': education}) 

而且在我的模板,如果這有助於澄清事情:

{% for education in education %} 
    <p><b>{{ education.school }}</b> {% if education.class_year %}{{ education.class_year|shorten_year}}, {% endif %} {{ education.degree}} 
     <input type="submit" name="edit_{{education.id}}" value='Edit' /> 
     <input type="submit" name="delete_{{education.id}}" value="Delete" /> 
    </p> 
{% endfor %} 

謝謝。

+0

我會做這一切通過AJAX,利用活塞或Django的休息-framwork了很多變化,但你不需要重新加載頁面 – sacabuche

回答

1
  1. 您每次從DB獲得education,但是如果您刪除或添加對象,則不會使用它。額外的請求數據庫沒有用。

  2. 同樣的形式,你不需要它,如果你刪除對象。並且您將其重新定義爲編輯和save_changes。

  3. add_school邏輯是特定於表單的,不需要將其放在視圖中。

  4. 您經常使用類似Education.objects.get(id=request.POST['education_id'])之類的東西。沒有驗證或異常處理,這是不好的。

  5. 您可以在列表中使用for週期,並在週期內使用return以僅處理第一個項目。這是非常奇怪的做法,如果你需要第一個項目只需使用lst[0]。或者如果您需要處理所有項目return應放置在一個循環之外。

+0

DrTyrsa:非常感謝你的反饋,這是非常有幫助。只有幾個問題,我不得不幫助我更好地理解你的觀點:對於第一點)'education = profile.education_set.order_by(' - class_year')'調用數據庫?我只是在評估數據庫時才調用db(而不是僅僅定義)。 3)從視圖中加入'add_school'邏輯,你會建議在forms.py中重載表單嗎? 4)什麼是更好的方式來做'Education.objects.get(id = request.POST ['education_id'])'?非常感謝您的幫助。 – David542

+1

1)。是的,它沒有被評估,我的錯誤,但只有在你打算使用它們的時候定義變量才更好。 3)。是的,您可以將'profile'傳遞給表單的構造函數或'save'方法。 4)。只需將它放在'try'塊中並捕獲'Education.DoesNotExists'異常。 – DrTyrsa