我想知道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標籤> [--------------------- - - - - - - - - 文本框 - - - - - - - - - - - - - - - - - - ]
等等
認識到我在文本框名稱周圍缺少一對引號。 – pj2452