2015-02-11 83 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

相關問題