【问题标题】:Django posts and responsesDjango 帖子和回复
【发布时间】:2012-05-20 22:58:55
【问题描述】:

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

我定义了几个模型

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 文档没有 似乎真的涵盖了这些稍微复杂的领域,所以我是 有点不确定。
  2. 我应该使用 render_to_response 还是 上面的HttpResponseRedirect?或者可能是我不知道的第三种选择 关于。

任何建议表示赞赏。

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

【问题讨论】:

    标签: python django jquery


    【解决方案1】:

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

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

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

    【讨论】:

    • 该页面并非完全由 javascript 生成,它基于 django html 模板,恰好有大量与此特定页面相关联的 javascript。事实上,我有一个结果部分,它提交一个 ajax 请求,然后使用 render_to_response 很好地更新页面而无需重新加载。但是现在我想保存/提交这些结果,实际保存不是问题,我现在只想重定向到不同的页面,而不是使用 render_to_response 来重建当前页面。希望这是有道理的。
    • 你不需要使用我上面提到的方法重建整个页面。您可以使用 HTML 片段,例如
      Your content and variables here
      ,然后将其插入到现有文档中,而无需重新渲染整个内容。只要你用 AJAX 获取这个片段,你就应该是金子。
    【解决方案2】:

    传递所有收集到的变量

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

    将值保存到模型中

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

    似乎重定向不太正确

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

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

    【讨论】:

    • OP表示使用HTML表单来创建他的模型对象是不合适的,所以ModelForm不会有太大用处。
    • 我所做的自然不适合表单、图像标记和用户选择动态构建的结果。也许我应该使用表单,但我不知道如何处理那些没有很好地包含在文本框或单选按钮中的数据。感谢您的建议。
    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2011-05-20
    • 2022-12-10
    • 2017-11-02
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多