2015-02-11 60 views
0

在单个HTML表单中,我将呈现不同的Django模型。将对象ID添加到Django表单中的字段名称中

这些表单可能(也可能会)具有相同的字段名称(如“内容”)。因此,我需要将模型实例的对象ID附加到表单中的每个字段,以确保它们具有唯一的HTML输入名称)。我做这在初始化像这样:

class Edit_Text_Block_Form(ModelForm): 
    content = forms.CharField(widget = forms.Textarea(
     attrs = { 
      "class": "full_tinymce" 
     }), 
     label = "", 
    ) 

    class Meta: 
     model = TextBlock 
     fields = [] 

    def __init__(self, user, *args, **kwargs): 
     self.user = user 
     super(Edit_Text_Block_Form, self).__init__(*args, **kwargs) 
     old_fields = self.fields 
     new_fields = {} 
     for field in old_fields: 
      new_fields[str(self.instance.id)+"_"+field] = self.fields[field] 
     self.fields = {} 
     for field in new_fields: 
      self.fields[field] = new_fields[field] 

这工作得很好,和HTML姓名和ID,如“96_content”,这是我想要的东西呈现。

但是,保存时,它会查看我的字段以保存“内容”字段,因为它仅显示“96_内容”并且感到困惑。因此,我需要重写模型保存功能。我一直这样做:

def save(self, *args, **kwargs): 
    old_fields = {} 
    for field in self.fields: 
     real_name = field.split("_")[1] 
     old_fields[real_name] = self.fields[field] 

    self.fields = old_fields 
    super(Edit_Text_Block_Form, self).save(*args, **kwargs) 

但是,这是不工作的原因,我不明白。保存功能完成没有错误,但没有任何形式的变化。我唯一的猜测是,当我做old_fields [real_name] = self.fields [field]时,字段值可能不会被复制。

我的主要问题是:如何让我的保存功能正确保存数据的字段后,我在初始化(已经改变了他们的名字)和save()

我希望问题在改回来是:我有更好的方式来做这件事吗? (通过“本”,我的意思是“命名空间的每个HTML场用的ModelForm的实例的OBJECT_ID,以确保其唯一性与包含在相同的HTML表单中的其他字段)?

感谢您的帮助!

回答

2

你不”吨需要做任何的这个,只要实例的形式时,使用prefix parameter

请注意,如果您的多种形式都是同一类型的,你应该用formsets代替。

+0

我不想因为我学到了很多关于Django内部工作的知识,所以称其为过去的24小时“浪费时间”本身。与我正在做的事情相比,这是非常简单的事情,但不要因为没有仔细阅读表格文档而尖叫自己。它们确实是不同的形式,所以前缀是要走的路。非常感谢! – 2015-02-11 18:36:56