Django的:如何回归模型表单集在阿贾克斯和模版使用(Django: How to return

2019-09-18 06:40发布

我需要动态的形式运行时使用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”对象有没有属性“_meta”

任何帮助表示赞赏,谢谢!

Answer 1:

你不发的背景下作为Ajax响应,您使用的上下文发送呈现模板片段。 模板应该只是包含要插入到您的div形式的HTML。



Answer 2:

只是丹尼尔的回答阐述作为评论请求。

Django是一个MVC风格的框架。 模型是为了存储和访问数据时使用。 在Django的控制器被称为意见,其中有正从具有一定URL用户的请求的任务,获得这可能与URL相关联的一些数据,然后按该数据throught一些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>/这将显示所有的关于这本书与指定标识的信息。 要做到这一点,几件事情需要发生。 第一个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将被返回给用户。 和HTML你可以拉使用AJAX,然后用它,但是你需要它。

希望这澄清一些概念你。

Django文档是优秀的,所以我会以电子书籍阅读也前奏。 这将解释所有的语法和一些我在这个答案(使用的快捷方式的选择render_to_response等)。



文章来源: Django: How to return model formset in ajax and use in template