2011-07-19 10 views
0

私はユーザーがオブジェクトの追加/編集/削除を可能にするビュー機能を持っています。次の機能はどのように見え、どのように改善することができますか?関数の各部を別々の部分に分けることを考えていましたが、「コンポーネント」はコードの4行5行以上ではないので、少し過度のことになると思いました。ビューの追加/編集の評価

@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

私は、ピストンまたはジャンゴ・静止framworkを使用して、AJAXを経由して多くの変更をすべてこれを行うだろうが、あなたはあなたのページ – sacabuche

答えて

1
  1. あなたはDBから毎回educationを得るが、あなたがオブジェクトを削除または追加する場合、それが使用されていません。使用しないDBへの余分な要求。

  2. オブジェクトと同じですが、オブジェクトを削除する場合は不要です。そして、あなたはeditとsave_changesのためにそれを再定義します。

  3. add_schoolロジックはフォーム固有のため、表示する必要はありません。

  4. 多くの場合、Education.objects.get(id=request.POST['education_id'])のようなものを使用します。バリデーションや例外処理はありませんが、これは悪いことです。

  5. リストの上にforサイクルを使用し、サイクル内にreturnを使用して、最初のアイテムのみを処理します。これは非常に奇妙なアプローチです。最初の項目が必要な場合はlst[0]を使用してください。または、すべてのアイテムを処理する必要がある場合は、returnをサイクル外に配置する必要があります。

+0

DrTyrsaをリロードする必要がいけない:フィードバックのためにどうもありがとうございました、これは非常に便利です。ポイント1については、 '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

関連する問題