2

我需要在运行时使用 ajax 动态地将表单添加到我的表单集,为此我指的是使用 Ajax 将表单动态添加到 Django 表单集

我在同一页面上有多个具有不同前缀的表单集。

我的模型是这样设计的:一个用户可以有很多部手机。电话可以有许多线路(如果需要详细信息) 访问表单集中的多对多“通过”关系字段

用户添加新手机后,我会使用 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' object has no attribute '_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)

现在您要添加一个 URL ,该 URLexample.com/book/<id>/将显示有关具有指定 id 的图书的所有信息。为此,需要发生几件事。首先 Django 控制器必须使用这种模式捕获 url。您在 urls.py 文件中指定 url 模式。

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

由于urls.py指定了 url 模式和视图之间的映射,这告诉 Django 每当用户访问具有指定模式的 URL 时,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。您可以使用 AJAX 提取 HTML,然后根据需要使用它。

希望这可以为您澄清一些概念。

Django 文档非常好,所以我建议也阅读介绍。它将解释我在此答案中使用的所有语法和一些快捷方式(render_to_response等)。

于 2012-06-19T20:48:26.887 回答
1

您不会将上下文作为 Ajax 响应发送,而是使用该上下文发送呈现的模板片段。模板应该只是包含要插入到 div 中的表单的 HTML。

于 2012-06-19T16:00:36.090 回答