Django发布和回复

时间:2012-05-20 22:58:56

标签: python django jquery

这不是一个技术问题,更像是“我是以正确的方式做这件事”的问题。

我定义了几个模型

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和许多事件函数以及其他javascript好东西的html页面。单击保存按钮时,我调用.ajax()并传递所有收集的变量

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 doc没有 真的好像覆盖了这些稍微复杂的区域,所以我就是一个 很不确定。
  2. 我应该使用render_to_response还是 HttpResponseRedirect上面?或者可能是我不知道的第三种选择 约。
  3. 任何建议表示赞赏。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

  

传递所有收集的变量

为什么不要$(form).serialize()

  

将值保存到模型中

为什么不使用django.forms.ModelForm(或少数人)?

  

似乎没有正确地重定向

因为AJAX中的重定向是在AJAX调用中处理的,并且不会影响打开的页面,除非您以某种方式处理JS中的接收数据。

此外,您没有任何数据验证和/或错误报告,这很糟糕。实际上,ModelForm应该为此提供巨大的帮助。