【问题标题】:Django form with dynamic fields and manytomany relationschips具有动态字段和多对多关系芯片的 Django 表单
【发布时间】:2013-08-21 13:03:08
【问题描述】:

我是 Django 新手用户,已经被这个问题困扰了好几个星期了。

考虑以下模型

class Post(models.Model):
    title = models.CharField(max_length=65)
    author = models.ForeignKey(User)
    date = models.DateField(auto_now_add=True)
    content = models.TextField()
    tags = models.ManyToManyField(Tag)
    images = models.ManyToManyField(Image)

def __unicode__(self):
    return self.title

我希望用户能够使用他的模型上传图片。我希望能够验证是否

  1. 用户至少上传了一张图片,并将图片的最大数量限制为一定数量。

  2. 基本上对标签做同样的事情。但是对于标签,我还希望 Django 检查标签是否已经存在,如果存在,请将其添加到模型中。

  3. 让用户按下一个显示添加标签/添加图像的按钮以弹出一个新字段。

到目前为止我遇到的问题。

  1. 我需要先保存模型,然后才能添加多对多关系。这有点烦人,因为如果在中途发生错误,可能一半模型被保存而另一个无效。

  2. 我知道我可以使用 js 向 DOM 添加额外的字段,但是我不知道如何在 View 函数中处理这些字段。

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    对于问题 1,这是有道理的,因为如果您创建的模型被其他模型引用,则该模型键必须存在。我建议你做的是查看saving multiple models with a transaction

    2 很简单,只需使用 jQuery/Javascript 根据用户的选择事件在浏览器中显示/隐藏相应的字段。

    根据您的评论,这是我如何处理与服务器之间的数据的示例

    //Submit data to server, assuming you have already extracted out the relevant data values
    $("some_button").click(function(e){
      $.ajax({
        url : "someUURLLocation/",
        type : "POST",
        data : {"data" : JSON.stringify({"field1" : var1, "field2" :var2}),
        dataType : "json",
        success : function(results){
          if (results.success == "true") {
            //handle DOM insertion and other stuff
          } else 
            alert(results.message);
        }
      });
    }
    

    urls.py:

    from django.conf.urls import patterns, url
    from $APPNAME import views
    
    urlpatterns = patterns("",
      ...
      ...
      url(r'^someURLLocation/$', views.handleDataSubmission),
      ...
    )
    

    views.py:

    from django.http import HttpResponse
    from django.utils import simplejson
    
    def handleDataSubmission(request):
      data = simplejson.loads(request.POST.get("data", None))
    
      if data is not None:
    
        newPost = Post.objects.create( field1 = data["field1"], field2 = data["field2"])
        dataReturn  = [{"val1" : newPost.title, "val2" : newPost.date}]
    
        return HttpResponse(simplejson.dumps({"success" : "true", "data" : dataReturn}), mimetype = "application/json")
    
      else:
        return HttpResponse(simplejson.dumps({"success" : "false", "message" : "Invalid data received by server"}), mimetype = "application/json")
    

    【讨论】:

    • 就像我说的,我知道如何向 DOM 添加字段,只是不知道如何在视图函数中处理它们。
    • 感谢您的示例。我只是想知道我也可以使用这种方法提交文件吗?
    • 是的,您可以使用这种方法处理文件上传。但是,我建议您查看 jQuery FileUpload 插件和stackoverflow.com/questions/5871730/… 处的信息
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2019-08-12
    • 2014-06-21
    • 2014-01-29
    • 2011-09-22
    • 1970-01-01
    • 2015-03-19
    • 2019-04-19
    相关资源
    最近更新 更多