2012-05-20 43 views
4

这不是一个技术问题,更多的是“我是以正确的方式做这件事”的问题。Django的帖子和回复

我有几个模型定义

class Style(models.Model): 
    tag_xml = models.TextField() 
    image = models.ImageField(upload_to="styles") 
    user = models.ForeignKey(User) 
    uploaded = models.DateField() 

class StyleMatch(models.Model): 
    style = models.ForeignKey(Style) 
    item = models.ForeignKey(FashionItem) 

他们无法通过HTML表单来填充只是由于工作的性质,所以为了填充这些我有jQuery和大量的html页面事件函数和其他JavaScript的好东西。当点击保存按钮被我称之为阿贾克斯(),并通过所有收集到的变量

var saveRequest= $.ajax({ 
url: "/save_style/", 
type: "POST",   
data: "selection="+s+"&user="+user+"&src="+image_src, 
dataType: "text"  
}); 

我save_style视图然后保存该值代入模型

def save_style(request): 
if request.method == 'POST': 
    selection = request.POST['selection'].rsplit("|") 
    user = request.POST['user'] 
    src = request.POST['src'] 

    f = open(MEDIA_ROOT+src) 
    image_file = File(f) 

    u = User.objects.get(id=user) 

    style = Style(tag_xml = "", 
        image = image_file, 
        user = u, 
        uploaded = date.today()) 
    style.save() 

    for s in selection: 
     if (s != ''): 
      match = FashionItem.objects.get(id=s) 
      styleMatch = StyleMatch(style = style, 
            item = match) 
      styleMatch.save() 

    i = StyleMatch.objects.filter(style=style) 
    items = FashionItem.objects.filter(id__in=i) 

    return render_to_response('style_saved.html', dict(image=src, items=items, media_url = MEDIA_URL), context_instance=RequestContext(request)) 

这样做之后,我真想进入成功页面并显示我刚添加到模型中的记录,但是如果我使用render_to_response并传回模型细节,则必须使用javascript重新构建整个页面,重新定向到新模板似乎更好,但如果我使用HttpResponseRedirect a)我不能传回值和b)它似乎没有重定向非常正确(我认为因为本帖来自我的javascript)。

所以最后我的问题

  1. 这真的是我应该怎么做呢? Django的文档不是 真的似乎覆盖了这些稍微复杂的领域,所以我 有点不确定。
  2. 我应该使用render_to_response还是 上面的HttpResponseRedirect?或者可能有第三种选择我不知道 左右。

任何建议表示赞赏。

仅供参考我知道上面的代码并不理想,即缺少验证,评论等,它仅仅是为演示目的而提供的。尽管指出任何严重的问题。

回答

0

通所有收集到的变量

为什么不$(form).serialize()的?

保存值代入模型

为什么不使用django.forms.ModelForm(或几个人)?

似乎并不被重定向完全正确

由于AJAX重定向的AJAX调用处理,除非你进程JS接收到的数据在某种程度上不影响打开的页面。

此外,您没有任何数据验证和错误报告,这是不好的。实际上,ModelForm应该提供巨大的帮助。

+0

OP声明不适合使用HTML表单来创建他的模型对象,所以ModelForm不会太有用。 – patrickn

+0

我正在做的事情自然不适合形式,标记图像和用户选择动态构建的结果。也许我应该使用表单,但是我不知道如何处理文本框或单选按钮中没有很好包含的数据。感谢您的建议。 – debugoz

1

根据应用程序的性质,您可能不应该使用JavaScript构建整个页面。但是,因为我们已经在那里使用了以下解决方案,并且结果很好:

考虑创建一个模板“片段”,就像我称之为的那样。它仅仅是一些HTML,旨在成为通过AJAX传输数据的胶囊。对此片段执行render_to_response,将处理后的视图数据作为变量传递,然后通过AJAX检索此数据,并使用JavaScript将指定的div元素中的HTML替换为返回的数据。

上述解决方案存在一些缺陷,例如模板片段上的样式和事件处理程序附件,但至少应该让您工作。在这方面只是一个提示,熟悉jQuery的.on()。

+0

该页面并非完全由javascript生成,而是基于django html模板,只是碰巧存在大量与此特定页面相关的javascript。事实上,我有一个结果部分提交ajax请求,然后使用render_to_response很好地更新页面而无需重新加载。但是现在我想保存/提交这些结果,实际的保存不是问题,我只想现在重定向到不同的页面,而不是使用render_to_response来重建当前页面。希望这是有道理的。 – debugoz

+0

您不需要使用上面提到的方法重建整个页面。您可以使用HTML片段(如

Your content and variables here
),并将其插入到现有文档中,而无需重新渲染整个文档。只要你用AJAX获取这个片段,你应该是金。 – patrickn