2017-01-10 4 views
0

目標:djangoクラスベースのビューからindex.htmlファイルにオブジェクトの配列を送信するにはどうすればいいですか?

私は、データベースからイベントオブジェクトを表示するためにFullCalendar(https://fullcalendar.io/)を使用します。 FullCalendarはイベントオブジェクトの配列をプロパティとして受け取ります。

私がいる問題:

を、私は私の知る限り、私は唯一のDjangoのテンプレートタグシステムを使用して、データと対話することができます知っているようにイベントオブジェクトをバックテンプレートにコンテキストデータを送ることができますが。 *編集:私はptoHistoryでハードコードされ、配列を交換するとき、私はクロームコンソールで次のエラーが表示されます。

jquery-3.1.1.min.js:2 Uncaught ReferenceError: ptoHistory is not defined at HTMLDocument. ((index):141) at j (jquery-3.1.1.min.js:2) at k (jquery-3.1.1.min.js:2)

のindex.html:

{% extends 'base.html' %} 

{% block content %} 

//ACCESSING THE CONTEXT DATA LIKE THIS WORKS BUT I CAN'T USE ptoHistory IN MY FULLCALLENDAR SCRIPT 
{% for history in ptoHistory %} 
<li>{{obj.leave_type}}</li> 
{% endfor %} 

<div class="container"> 
    <div id="calendar"> 
    <!-- Calendar is injected here --> 
    </div> 

<!----------------------- SCRIPTS -----------------------------> 
<script> 

$(document).ready(function() { 

    $('#calendar').fullCalendar({ 
    defaultView:'month', 
    editable: true, 
    // MY ARRAY OF OBJECTS WILL REPLACE THIS HARDCODED ARRAY 
    events: [ 
     { 
     title: 'All Day Event', 
     start: '2017-01-12', 
     }, 
     { 
     title: 'Meeting', 
     start: '2017-01-13T10:30:26', 
     end: '2014-06-13T12:30:00' 
     }, 
    ], 


    }); 

}); 

</script> 


{% endblock content%} 

IndexView.py:

class IndexView(FormView): 
    template_name = 'accounts/index.html' 
    form_class = PtoRequestForm 
    success_url = 'login/' 

    def form_valid(self, form): 
     form.save() 
     return super(IndexView, self).form_valid(form) 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['ptoHistory'] = PtoHistory.objects.all() 
     print(context['ptoHistory']) 
     return context 

誰かが私を正しい方向に向けることができますか?

+0

問題がどこにあるのかわかりません。あなたはすでにデータをビューに正しく渡していますが、他に何を求めていますか? – dabadaba

+0

@dabadaba質問を更新しました。 "私が抱えている問題"を再読してください。 – FlashBanistan

+0

基本的には、スクリプトのビューから送信されたデータを使用したいのですか? JSがどのようにデータを見ているかを見て、Django側かJS側のどちらかで正しく設定して、カレンダープラグインが期待するものと一致させることができます。私は前と同じシナリオに遭遇しました。あなたのスクリプトではなく、ビューでデータをフォーマットして構築することをお勧めします。 – dabadaba

答えて

1

あなたはそうです、それは動作しません。 Djangoテンプレートシステムは、テンプレートがレンダリングを終了する前に実行されるため、Pythonオブジェクトを処理することができます。

あなたはまだPythonのリストをjavascriptに割り当てることができますが、pythonのオブジェクトではなくjsonの文字列で割り当てることができます。このソリューションは、基本的にはビューで必要なものだけをvalues()を使用して作成します。 PtoHistoryにはどのフィールドが必要かわかりませんが、次のようにすることができます。

# views.py 
import json 
def get_context_data(self, **kwargs): 
    context = super(IndexView, self).get_context_data(**kwargs) 
    ptoHistory = json.dumps(list(PtoHistory.objects.values())) 
    # or do this if you only need several fields' value 
    # ptoHistory = json.dumps(list(PtoHistory.objects.values('field1', 'field2'))) 
    context['ptoHistory'] = ptoHistory 

    return context 

// in javascript 
$(document).ready(function() { 

    $('#calendar').fullCalendar({ 
    defaultView:'month', 
    editable: true, 
    var histories = {{ ptoHistory|safe }}; 
+0

いくつかの値については、私はjsonシリアライズ可能ではないdatetimeフィールドを持っています。私はそれらをシリアル化しようとするとエラーが発生します。 – FlashBanistan

+0

シンプルで、これをチェックしてください:http://stackoverflow.com/questions/5583401/serialize-datetime-to-json-in-django –

+0

ありがとうございました。私はまた、シリアル化することができないというユーザオブジェクトへの外部キーフィールドを持っています。私もそれをシリアル化する方法はありますか? – FlashBanistan

関連する問題