Django:如何在ajax中返回模型formset并在模板中使用

时间:2012-06-19 15:49:49

标签: django http jquery django-templates

我需要在运行时使用ajax动态地将表单添加到我的formset,我指的是Dynamically adding a form to a Django formset with Ajax

我在同一页面上有多个不同前缀的formset。

我的模型设计如下: 用户可以拥有许多手机。手机可以有很多行(如果需要详细信息) Accessing Many to Many "through" relation fields in 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 formset,我会收到错误 AttributeError:'LineFormFormSet'对象没有属性'_meta'

感谢任何帮助,谢谢!!

2 个答案:

答案 0 :(得分:2)

根据评论中的要求,详细说明丹尼尔的回答。

Django是一个MVC风格的框架。模型用于存储和访问数据。在Django中,控制器被称为视图,它具有从具有特定URL的用户获取请求的工作,获取可能与该URL相关联的一些数据,然后将该数据推送到某些tempalte,这将使用数据视图给它为了填写模板内的占位符。

这是一个简单的例子,它解释了所有方面。想象一下,有一个网站有一个书籍数据库。因此,您的模型将存储与每本书相关的信息 - 标题,作者,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 example.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等)。

答案 1 :(得分:1)

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