2014-12-23 47 views
0

我想知道value_from_datadict方法如何確定哪些表單輸入提取並作爲其「數據」變量傳遞。Django:如何將值傳入value_from_datadict

我有一個自定義小部件,可以將選定項從複選框列表傳遞給value_from_datadict方法。每個選中的複選框都將一個唯一的id值傳遞給value_from_datadict。我還在每個複選框列表項旁邊都有一個文本框,我希望用戶能夠爲每個項目提供可定製的名稱。

我遇到的問題是我無法將文本框值提取到value_from_datadict中。

有沒有辦法告訴小部件也提取文本框的值?

謝謝。

CODE編輯

# from models.py 
class MyObject(models.Model): 
    name = models.CharField(max_length=30) 
    myData = models.TextField() 

    # other fields... 

    history = HistoricalRecords() 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ['name'] 

class myDataField(models.Model): 
    name = models.CharField(max_length=10) 
    order = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ['order'] 

# from forms.py 
class MyObjectEditForm(ModelForm): 

    # other form fields... 

    myData = forms.CharField(required=False, widget=MyWidget) 

    def clean_myData(self): 
     myData = self.cleaned_data['myData'] 
     if not literal_eval(myData): 
      raise forms.ValidationError("Must have at least one instance.") 
     return myData 

# from form_page.html 
<p> 
    {{ form.myData.errors }} 
    <label for="id_myData">MyData Types:</label> 
    {{ form.myData }} 
</p> 

# from widgets.py 
class MyWidget(Widget): 

    def __init__(self, *args, **kwargs): 
     self.key_attrs = {} 
     self.val_attrs = {} 
     if "key_attrs" in kwargs: 
      self.key_attrs = kwargs.pop("key_attrs") 
     if "val_attrs" in kwargs: 
      self.val_attrs = kwargs.pop("val_attrs") 
     Widget.__init__(self, *args, **kwargs) 

    def render(self, name, value, attrs=None): 
     if not value: 
      value = '{}' 
     value = literal_eval(value) 

     mDFs = MyDataField.objects.all() # get all MyDataField objects 

     ret += '<div id="myData"><br>' 
     ret += '<label for="myData"> MyData Types: </label>' 
     ret += '<table>' 
     for i in range(len(mDFs)): 
      ret += '<tr><td>' 
      ret += '<label for="id_myData_{}">'.format(k, typ, i) 
      ret += '</td><td>' 
      ret += '<input id="id_myData_{}" name="myData" type="checkbox" value="{}" {}>'.format(i, mDFs[i].pk, 'checked' if mDFs[i].pk in value.keys() else '') 
      ret += ' {}</label>'.format(myDFs[i].name) 
      ret += '</td><td>' 
      ret += '<input id="id_txtbox_myData_{} name="txtbox_myData" type="textbox" value="{}">'.format(i, mDFs[i].name) 
      ret += '</td></tr>' 
      ret += '</table><br>' 
      ret += '</div>' 

     return mark_safe(ret) 

    def value_from_datadict(self, data, files, name):    
     myData_keys = [] 

     for k in data.keys(): 
      if k.startswith("myData"): 
       myData_keys.append(k) 

     myData_dict = {} 

     # Not sure what to do here... 

     return str(myData_dict) //serialized dict of all myData types 

我基本上要到myData的CHEC結合kbox主鍵在一個元組中帶有文本框輸入(pk,「customizableName」),然後將其存儲在myData_dict中。

形式看起來是這樣的(粗):

[複選框] <邁德特的Type1標籤> [----------------------- - - - - - - - 文本框 - - - - - - - - - - - - - - - - - - ] [複選框] < MyData Type2標籤> [------------------------------------- textbox - ----------------------------------] [複選框] < MyData Type3標籤> [----- - - - - - - - - - - - - - - - - 文本框 - - - - - - - - - ------------------] [複選框] < MyData Type4標籤> [--------------------- - - - - - - - - 文本框 - - - - - - - - - - - - - - - - - - ]

等等

+0

認識到我在文本框名稱周圍缺少一對引號。 – pj2452

回答

1

您可以在the source看到這一點:這不是很複雜的,它傳遞的數據字典和名稱參數,默認情況下,它只是會從對應名稱的鍵的值。

如果您追求的東西有點複雜,也許MultiWidget的相關代碼可能會有用:它只是爲每個子部件調用value_from_datadict。

如果您仍然遇到問題,您應該粘貼您的小部件的代碼。

編輯

有大量的事情你的代碼錯誤,但基本上這是完全錯誤的做法。

我不知道你的意思是「將數據存儲在字典中」 - 這不是value_from_datadict完全是什麼,它是爲了返回一個值來顯示在小部件中 - 我也無法想象爲什麼你想要「序列化」結果,但問題比這更深入。

你的小部件不應該做任何它正在做的事情。最具體的說,它不應該查詢數據庫並輸出每行的輸入。它不應該包括每一行的複選框和文本輸入。通常情況下,如果你想這樣做,你可以使用MultiWidget,正如我上面提到的那樣,但這不是很合適,因爲需要多行。

這裏實際需要的不是一個自定義小部件,甚至不是一個自定義小部件,而只是一個formset。 formset中的每個表單都可以與單個MyData實例相關聯,並且每個表單都可以有一個文本字段和一個布爾字段。

+0

添加代碼。我試着查看片段,但我仍然不知道如何從文本框中獲取數據。 難道是我的自定義小部件無法看到文本框的值,因爲它的html id標記/標籤或因爲它沒有在forms.py中實例化? – pj2452

+0

絕對是一個很好的方法,如果我需要徹底改變這個方法,將會實施。 謝謝。 – pj2452

相關問題