2012-09-06 30 views
5

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")); 
    }); 
}); 
+0

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ử

Trả lời

2

Căn tắt this question/answer (và điều này là thô, chưa được thử nghiệm, hy vọng một sự khởi đầu):

class myClassForm(forms.Form): 
    class Meta: 
     model = myClass 
     fields=["name"] 

    reoccurrance = forms.ChoiceField(label="Reoccurance", choices=(), 
            widget=forms.Select(attrs={'class':'selector'})) 


def __init__(self, *args, **kwargs): 
    super(myClassForm, self).__init__(*args, **kwargs) 
    choices = [] 
    for pt in Reoccurance.objects.all(): 
     choices.append((pt.id, unicode(pt.days))) 
    self.fields['reoccurrance'].choices = choices 
+0

Tôi đã suy nghĩ cùng một dòng. Rất ít vấn đề: Tôi muốn văn bản của từng lựa chọn trở thành "nhãn". Vì vậy, thay vào đó, tôi đã thử choices.append ((unicode (pt.days), pt.label)).Nhưng điều này khiến tôi phải đối mặt với vấn đề mà tôi dự đoán. Mô hình mong đợi giá trị của lựa chọn bằng id, không phải là ngày. Vì vậy, khi nó cố gắng xếp hàng lựa chọn người dùng với id trong cơ sở dữ liệu, tốt nhất, nó cho thấy một sự không phù hợp giữa những gì đã được chọn và những gì được trả về. Tại tồi tệ nhất, nó nói rằng không có mục nhập từ bảng Reoccurance phù hợp với việc lựa chọn người dùng (ví dụ, không có id bằng 365). –

+1

Kiểm tra điều này? http://stackoverflow.com/questions/5089396/django-form-field-choices-adding-an-attribute – Joseph

+0

Tuyệt vời! Cảm ơn!! Điều này sẽ đưa ngày vào mẫu. Nhưng bây giờ làm thế nào để tôi có được những ngày trong số các tùy chọn được lựa chọn? Xem bản sửa đổi ở trên. –

Các vấn đề liên quan