4

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

我定义了几个模型

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 中重建整个页面,似乎更好地重定向到一个新模板,但如果我使用HttpResponseRedirecta) 我无法传回值,并且 b) 它似乎没有正确重定向(我认为因为帖子来自我的 javascript)。

所以最后我的问题

  1. 我真的应该这样做吗?django 文档似乎并没有真正涵盖这些稍微复杂的领域,所以我有点不确定。
  2. 我应该在上面使用 render_to_response 还是 HttpResponseRedirect ?或者可能是我不知道的第三种选择。

任何建议表示赞赏。

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

4

2 回答 2

1

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

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

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

于 2012-05-21T12:23:19.060 回答
0

传递所有收集的变量

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

将值保存到模型中

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

似乎重定向不太正确

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

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

于 2012-05-21T05:28:58.100 回答