Tôi có một mô hình hành động mà có một chìa khóa nước ngoài trong đó xác định mức độ thường xuyên một hành động cơn đau xuất hiện:Lấy dữ liệu bổ sung vào django lựa chọn hình thức thả xuống
class Reoccurance(models.Model):
label = models.CharField("Label", max_length=50, unique = True)
days = models.IntegerField("Days")
def __unicode__(self):
return self.label
class Meta:
ordering = ['days']
class Action(models.Model):
name = models.CharField("Action Name", max_length=200, unique = True)
complete = models.BooleanField(default=False, verbose_name="Complete?")
reoccurance = models.ForeignKey(Reoccurance, blank=True, null=True, verbose_name="Reoccurance")
Tôi đang thực hiện một ModelForm hành động có kết quả trong HTML cho reoccurance (dựa trên các giá trị cơ sở dữ liệu đang tồn tại cho bảng Reoccurance):
<select id="id_reoccurance" class="select" name="reoccurance">
<option value="" selected="selected">---------</option>
<option value="12">2 Days</option>
<option value="1">3 Days</option>
<option value="2">5 Days</option>
<option value="10">6 Days</option>
<option value="9">1 Week</option>
<option value="3">10 Days</option>
<option value="4">2 Weeks</option>
<option value="11">3 Weeks</option>
<option value="5">1 Month</option>
<option value="13">6 Weeks</option>
<option value="6">1 Quarter</option>
<option value="7">6 Months</option>
<option value="8">1 Year</option>
</select>
Như bạn có thể thấy, mặc dù các lựa chọn theo thứ tự ngày tăng dần, các giá trị ra khỏi trật tự bởi vì họ đã nhập vào cơ sở dữ liệu ra của trật tự.
Tôi muốn tạo một số jquery để tính toán động ngày mà hành động sẽ tái diễn. Nó sẽ lấy ngày hôm nay và thêm số ngày tương ứng với lựa chọn mà người dùng đã chọn. Nhưng với dữ liệu tôi nhận được trong biểu mẫu, tôi không thể dịch lựa chọn này thành một số ngày được đặt. Ngay cả khi các giá trị của các mục tùy chọn theo thứ tự, nó vẫn không cho biết rằng "1 Year" là 365 ngày.
Dữ liệu này mặc dù nằm trong bảng Reoccurance. Đối với nhãn = "1 Năm", ngày = 365. Tương tự như vậy cho tất cả các mục trong bảng Reoccurance.
Có cách nào để viết lại modelForm của tôi để có lẽ giá trị tùy chọn của từng mục thả xuống bằng với số ngày cho lựa chọn đó? Bởi vì sau đó, tôi có thể truy cập vào số ngày:
$("#id_reoccurance").change(function() {
alert($(this).val());
});
Điều này có ảnh hưởng xấu đến khả năng liên kết lại lựa chọn đúng với hàng chính xác của bảng Reoccurance không? Có cách nào khác tôi có thể truy cập vào ngày/nhãn tie này trong jquery trên mẫu biểu mẫu của tôi không?
Cập nhật
Nhờ gợi ý của Joseph để kiểm tra this post, tôi đã có thể bao gồm một tiêu đề trong phần tùy chọn của tôi:
from django.utils.html import conditional_escape, escape
from django.utils.encoding import force_unicode
class SelectWithTitles(forms.Select):
def __init__(self, *args, **kwargs):
super(SelectWithTitles, self).__init__(*args, **kwargs)
# Ensure the titles dict exists
self.titles = {}
def render_option(self, selected_choices, option_value, option_label):
title_html = (option_label in self.titles) and \
u' title="%s" ' % escape(force_unicode(self.titles[option_label])) or ''
option_value = force_unicode(option_value)
selected_html = (option_value in selected_choices) and u' selected="selected"' or ''
return u'<option value="%s"%s%s>%s</option>' % (
escape(option_value), title_html, selected_html,
conditional_escape(force_unicode(option_label)))
class ChoiceFieldWithTitles(forms.ChoiceField):
widget = SelectWithTitles
def __init__(self, choices=(), *args, **kwargs):
choice_pairs = [(c[0], c[1]) for c in choices]
super(ChoiceFieldWithTitles, self).__init__(choices=choice_pairs, *args, **kwargs)
self.widget.titles = dict([(c[1], c[2]) for c in choices])
class ActionForm(forms.ModelForm):
reoccurance = ChoiceFieldWithTitles()
def __init__(self, *args, **kwargs):
super(ActionForm, self).__init__(*args, **kwargs)
choices = []
for pt in Reoccurance.objects.all():
choices.append((pt.id, pt.label, pt.days))
self.fields['reoccurance'] = ChoiceFieldWithTitles(choices = choices)
Fantastic. Vì vậy, bây giờ tôi nhận được như sau trong mẫu của tôi:
<select id="id_reoccurance" class="selectwithtitles" name="reoccurance">
<option value="12" title="2" >2 Days</option>
<option value="1" title="3" >3 Days</option>
<option value="2" title="5" >5 Days</option>
<option value="10" title="6" >6 Days</option>
<option value="9" title="7" >1 Week</option>
<option value="3" title="10" >10 Days</option>
<option value="4" title="14" >2 Weeks</option>
<option value="11" title="21" >3 Weeks</option>
<option value="5" title="30" >1 Month</option>
<option value="13" title="42" >6 Weeks</option>
<option value="6" title="90" >1 Quarter</option>
<option value="7" title="180" >6 Months</option>
<option value="8" title="365" >1 Year</option>
</select>
Ok, nó có vẻ như chúng tôi gần như ở đó, nhưng tôi bị vấp lên. Trong jquery, tôi đang cố gắng sau đây để có được tiêu đề của tùy chọn được chọn:
$(function() {
$("#id_reoccurance").change(function() {
alert($(this).attr('title'));
});
});
Vấn đề là nó trở lại như không xác định!
Cập nhật Got it
$(function() {
$("#id_reoccurance").change(function() {
alert($(this).find("option:selected").attr("title"));
});
});
Tôi tin rằng bạn có thể đưa dữ liệu vào các trường mẫu thuộc tính trong biểu mẫu __init __(), nhưng tôi không chắc chắn về phương pháp chính xác để làm điều đó vì bạn không chỉ đặt nó trên một widget đầu vào đơn lẻ mà trên một số phần tử