2

実行時にajaxを使用してフォームセットにフォームを動的に追加する必要があります。これについては、Ajaxを使用してDjangoフォームセットにフォームを動的に追加することを指します。

同じページに異なるプレフィックスを持つ複数のフォームセットがあります。

私のモデルは次のように設計されています。ユーザーは多くの電話を持つことができます。電話には多くの回線を含めることができます(詳細が必要な場合) Formsetsの多対多の「スルー」リレーションフィールドへのアクセス

ユーザーが新しい電話を追加したら、ajaxを使用して電話を保存します。ビューは次のとおりです

def addUserPhone(request, customer_id, location_id, user_id, **kwargs):
error_msg = u"No POST data sent."
context = {}
if request.is_ajax():
            if request.method == "POST":
                user = End_User.objects.get(id=user_id)
                phone_client = PartialPhone_ClientForm(request.POST, prefix='new_client')
                instance = phone_client.save()
                #associate user to a phone
                instance.end_user.add(user)

                #Creating an empty lineFormset for a phone
                LineFormSet = modelformset_factory(Line, form=Line_Form, can_delete=True)
                client_lines  = LineFormSet(queryset=Line.objects.none(), prefix='phone_client_'+str(instance.id))

                # how to return the two objects instance and client_lines back to the template?? 
                #format = 'json'
                #mimetype = 'application/javascript'
                #data = serializers.serialize(format, [instance])
                #return HttpResponse(data)

                #can we return as a context?? this gives me only a string "phoneline_set" in the template   
                context['phone'] = instance
                context['line_set'] = client_lines
                return HttpResponse(context)
            else:
                error_msg = u"Insufficient POST data (need 'Name ' and 'Telephone Number'!)"

else:
        error_msg = "Non Ajax"
return HttpResponseServerError(error_msg)

電話インスタンスとLineFormSetをテンプレートでレンダリングするためのビューに戻すための最良の方法は何ですか?

コンテキストを返すだけの場合、ビューは文字列「phoneline_set」のみを取得します。しかし、私は次のようなことをしたい

  $.post("addUserPhone/",phoneData,function(data){
            $('.scroll').append("<h2> {{ line_set }} </h2>")

            });

Jsonを使用してシリアル化して渡す場合、LineFormSetを渡してテンプレートで使用するにはどうすればよいですか?現在、client_linesフォームセットをシリアル化しようとすると、エラーAttributeErrorが発生します:'LineFormFormSet'オブジェクトには属性'_meta'がありません

どんな助けでもありがたいです、ありがとう!

4

2 に答える 2

2

コメントで要求されたダニエルの答えを詳しく説明します。

DjangoはMVCスタイルのフレームワークです。モデルは、データを保存してアクセスするために使用されます。Djangoでは、コントローラーはビューと呼ばれ、特定のURLを持つユーザーからリクエストを取得し、そのURLに関連付けられている可能性のあるデータを取得し、そのデータを、指定されたデータビューを使用する一時的なデータにプッシュします。テンプレート内のプレースホルダーを入力するため。

これはすべての側面を説明する簡単な例です。本のデータベースを持っているウェブサイトがあると想像してください。したがって、モデルには、各本に関連する情報(タイトル、著者、ISBN番号など)が格納されます。

# models.py
class Book(models.Model):
    title = models.CharField(max_length=64)
    author = models.CharField(max_length=64)
    isbn = models.CharField(max_length=64)

example.com/book/<id>/次に、指定されたIDを持つ本に関するすべての情報を表示するURLを追加します。それが起こるためには、いくつかのことが起こる必要があります。最初のDjangoコントローラーは、このパターンでURLをキャッチする必要があります。urls.pyファイルでurlパターンを指定します。

# urls.py
urlpattern('',
    url(r'^book/(?P<id>\d+)/$', views.book),
)

URLパターンとビューの間のマッピングを指定するためurls.py、ユーザーが指定されたパターンのURLにアクセスするたびに、Djangoはビューにリクエストを送信する必要があることをDjangoに通知しbookます。さらに、Djangoは本のIDをビューに渡します。

# views.py
def book(request, id):
    # get the book
    book = get_object_or_404(Book, pk=id)
    context = {
        'book': book
    }
    return render_to_response('book_template.html', context)

したがって、ビュー内では、本のIDが与えられると、データベースから本を検索するためにモデルが使用され、見つからない場合は、ユーザーに404エラーが返されます。次に、呼び出した辞書contextに、テンプレートに渡す値を入力します。テンプレートの仕事は、このcontext辞書を取得し、その中の値を使用して、テンプレート内のいくつかのプレースホルダーを入力することです。

# book_template.html
<html>
<head>...</head>
<body>
   <h1>{{ book.title }}</h1>
   <p>Author: {{ book.author }}</p>
   <p>ISBN: {{ book.isbn }}</p>
</body>
</html>

したがって、テンプレートはビューからコンテキストを取得し、コンテキストのbook内部を使用して、の内部の値を入力します{{ }}

あなたの場合、あまり意味のないコンテキストをユーザーに返そうとしています。あなたがしなければならないことは、そのコンテキストを取り、それ{ 'phone': instance, 'line_set': client_lines }に応じて、ユーザーに返されるHTMLをレンダリングするテンプレートを作成することです。そして、そのHTMLは、AJAXを使用してプルし、必要に応じて使用できます。

うまくいけば、これはあなたのためにいくつかの概念を明らかにします。

Djangoのドキュメントは優れているので、イントロも読むことをお勧めします。この回答で使用したすべての構文といくつかのショートカット(render_to_responseなど)について説明します。

于 2012-06-19T20:48:26.887 に答える
1

コンテキストをAjax応答として送信するのではなく、そのコンテキストを使用してレンダリングされたテンプレートフラグメントを送信します。テンプレートは、divに挿入するフォームを含むHTMLである必要があります。

于 2012-06-19T16:00:36.090 に答える