Django形式具有动态字段和多种关系

时间:2013-08-21 13:03:09

标签: python django forms

我是初学者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. 让用户按下一个按钮,显示添加标记/添加图像以弹出新字段。

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

    1. 在添加多对多关系之前,我需要保存模型。这有点令人讨厌,因为如果在道路中途发生错误,可能会保存一半模型而另一半无效。

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

1 个答案:

答案 0 :(得分: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")