2016-07-05 8 views
0

私のフィードバックフォーラムタイプのWebアプリケーション用の作業用の編集フォームがありますが、投稿の内容を編集フォームに表示する方法がわかりません。ユーザーが「編集」をクリックしてフィードバックの編集用のURLにアクセスし、フィードバック・ポストのタイトルと本文を既にフォームに入れておきたい。私はDjangoを使用していますが、これを達成する方法についてのドキュメントは見つかりません。データベースからのデータをdjangoフォームフィールドに表示

これは周りに私の現在の仕事はでオリジナルのポストを表示することですviews.py

def edit_feedback(request, feedback_id, board): 
    boardObj = Board.objects.get(board_name=board) 
    boardGroups = boardObj.groups.all() 
    userGroups = request.user.groups.all() 
    userBoardAccess = False 
    boardFeedbacks = Feedback.objects.filter(feedback_board=boardObj.id) 
    userFeedbacks = Feedback.objects.filter(feedback_user=request.user.profile.id) 
    print boardFeedbacks 
    for group in boardGroups: 
     if group in userGroups: 
      userBoardAccess = True 
      break 
    if not userBoardAccess: 
     messages.error(request, 'Cannot view a board you are not a member of.') 
     return boards(request) 

    post = Feedback.objects.get(id=feedback_id) 
    form = EditFeedbackForm() 
    if post.feedback_user == request.user.profile: 
     if request.method == 'POST': 
      form = EditFeedbackForm(request.POST) 
      if form.is_valid(): 
       title = form.cleaned_data['title'] 
       body = form.cleaned_data['body'] 
       post.feedback_title = title 
       post.feedback_description = body 
       post.feedback_last_modified = datetime.now() 
       post.save(update_fields=['feedback_title', 'feedback_description', 'feedback_last_modified']) 
       print "saved feedback " + str(post.id) 
     else: 
      form = EditFeedbackForm() 
    else: 
     messages.error(request, 'Cannot edit a post you did not write.') 
     return redirect('/board/' + board + '/') 

    return render(request, 'app/edit_feedback.html', {'form': form, 'board': boardObj.board_name, 'boardid': boardObj.id, 'boardObj': boardObj, 'feedback': post, 'userFeedbacks': userFeedbacks}) 

そしてedit_feedback.htmlテンプレート

{% extends 'app/base.html' %} 
{% load i18n widget_tweaks %} 
{% load board_extras %} 

{% block content %} 
<div id="body-wrapper"> 
    <h1><a id="undecorated" href="/board/{{board}}">{{board}}</a></h1> 
    <!-- show current feedback --> 
    <div style="margin-left: 50px;"> 
     <h4>{{feedback.feedback_title}} | {{feedback.feedback_last_modified }}</h4> 
     <h5>{{ feedback.feedback_description }}</h5> 
    </div> 

    <!-- edit form --> 
    <form role="form" action="" method="post"> 
     {% csrf_token %} 
     {% for field in form %} 
      {% if field.errors %} 
       <div class="form-group has-error"> 
        <label class="col-sm-2 control-label" for="id_{{ field.name }}"> 
        {{ field.label }}</label> 
        <div class="col-sm-10"> 
         {{ field|attr:"class:form-control" }} 
         <span class="help-block"> 
         {% for error in field.errors %} 
          {{ error }} 
         {% endfor %} 
         </span> 
        </div> 
       </div> 
      {% else %} 
       <div class="form-group"> 
        <label class="col-sm-2 control-label" for="id_{{ field.name }}">{{ field.label }}</label> 
        <div class="col-sm-10"> 
         {{ field|attr:"class:form-control" }} 
         {% if field.help_text %} 
          <p class="help-block"><small>{{ field.help_text }}</small></p> 
         {% endif %} 
        </div> 
       </div> 
      {% endif %} 
     {% endfor %} 
     <div class="form-group"> 
      <div class="col-sm-offset-2 col-sm-10"> 
       <button type="submit" class="btn btn-primary" value="Save">{% trans "Save" %}</button><br> 
      </div> 
     </div> 
    </form> 
</div> 
{% endblock %} 

forms.py

class EditFeedbackForm(forms.Form): 
    title = forms.CharField(label='Title') 
    body = forms.CharField(label='Body', widget=forms.Textarea) 

edit_feedbackビューで私のEditFeedbackFormですt彼はページの上部にあるので、ユーザーは変更を加えるためにフォームにコピーアンドペーストすることができますが、明らかにそれは理想的ではありません。

答えて

1

フォームを自分で作成する代わりに、DjangoのGeneric Update Viewを使用できます。ドキュメントから

スニペット:

、既存のオブジェクトを編集(もしあれば)検証エラーのあるフォームを再表示し、オブジェクトへの変更を保存するためのフォームを表示するビュー。これは、(フォームクラスを手動で指定しない限り)オブジェクトのモデルクラスから自動的に生成されたフォームを使用します。

上記のリンク先のドキュメントにも十分な例があります。

+0

私は自分の編集フィードバックビューを含んでいますが、私が持っているものにUpdateViewを組み込む方法はありますか、やり直す必要はありますか?あまりにも単純すぎるために提供するサンプルが見つかりました – Catherine

+0

UpdateViewをサブクラス化してビューを書き直してみてください。すでに書いたことを無視して、ドキュメントの例に従ってください。作業が完了したら、独自のカスタムビューを作成できます。しかし、あなたがしようとしていることについては、「過度に単純な」例だけが必要です。 – marcusshep

+0

@Catherine私は、過去に私自身のビューをロールバックした後、自分自身でジェネリックビューを使い始めました。彼らは本当に便利です。私はDjangoのソースを読んだときにわかりましたが、それは重いミックスですが、コードはかなり明確です。彼らはあなたのコードを手続き型ではなく宣言型に変更することができるので、使いやすいです... – rrauenza

関連する問題