2012-09-06 11 views
5

Django formu açılır seçimine ek verileri alın:Ben bir eylem tekrarlanırsa ne sıklıkta belirten bir yabancı anahtar vardır bir Eylem modeli var

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") 

ben yapıyorum için HTML kodu ile sonuçlanan Eylem bir modelForm tekrarının (tekrarının tablo için mevcut veritabanı değerlerine dayanarak): Gördüğünüz gibi seçimleri artan gün sırayla olsa onlar dışarı veritabanına girildi, çünkü değerler sıralamada olmaması

<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> 

düzenin.

Eylemin ne zaman tekrarlayacağı tarihi dinamik olarak hesaplayan bir jquery oluşturmak istiyorum. Bugünün tarihini alacak ve kullanıcının seçtiği seçime karşılık gelen gün sayısını ekleyecektir. Ama formda aldığım verilerle, seçimi belirli bir güne çeviremiyorum. Seçenek öğelerinin değerleri sıralı olsa bile, yine de "1 Yıl" ifadesinin 365 güne eşit olduğunu göstermez.

Bu veriler yine de Reoccurance tablosunda. Etiket = "1 Yıl" için, gün = 365. Aynı şekilde, Reoccurance tablosundaki tüm öğeler için.

ModelForm'ımı yeniden yazmanın bir yolu var mı? Böylece, her bir aşağı açılan öğenin seçenek değeri, bu seçim için gün sayısına eşittir.

$("#id_reoccurance").change(function() { 
    alert($(this).val()); 
}); 

bu olumsuz ve tekrarının tablonun doğru satıra doğru ve tekrarının seçimini kravat yeteneğimi etkiler mi: Çünkü o zaman, ben gün sayısını erişebilir? Bu günlere erişebilmem için başka bir yol var mı?

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) 

Fantastik:

Güncelleme this post kontrol etmek Joseph'in önerisine

Teşekkür, benim seçenek elemanda bir başlık eklemeyi başardı. neredeyse geldik gibi

<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> 

Tamam, öyle görünüyor ki, ama takıldı alıyorum: Şimdi ben şablonunda aşağıdaki olsun.

$(function() { 
    $("#id_reoccurance").change(function() { 
     alert($(this).attr('title')); 
    }); 
}); 

Sorun o geri dönme konusu tanımsız oluyor ki: jquery, ben belirlenen seçeneğe unvanı almaya aşağıdaki çalışıyorum!

Güncelleme o

$(function() { 
    $("#id_reoccurance").change(function() { 
     alert($(this).find("option:selected").attr("title")); 
    }); 
}); 
+0

formun __init __() içindeki öznitelikleri, ancak bunu yalnızca bir giriş parçacığına değil, bir dizi

cevap

2

this question/answer kapalı oturtmakta var (ve bu, umarım bir başlangıç ​​test edilmedi, kaba): Sana form alanları veri koyabilirsiniz inanıyoruz

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

Aynı çizgide düşünüyordum. Birkaç sorun: Her seçimin metninin "etiket" olmasını istiyorum. Bunun yerine, options.append denedim ((unicode (pt.days), pt.label)).Ama bu beni tahmin ettiğim problemle karşı karşıya bırakıyor. Model, seçimin değerinin güne değil, kimliğe eşit olmasını bekler. Bu nedenle, kullanıcı seçimini veritabanındaki kimlikle sıralamaya başladığında, en iyisi, neyin seçilip neyin döndüğü arasında bir uyuşmazlık olduğunu gösterir. En kötüsü, Reoccurance tablosundan kullanıcı seçimiyle eşleşen bir girdi olmadığını söylüyor (örneğin, 365'e eşit bir kimlik yok). –

+1

Bunu kontrol et? http://stackoverflow.com/questions/5089396/django-form-field-choices-adding-an-attribute – Joseph

+0

Harika! Teşekkürler!! Bu günleri şablona alır. Ama şimdi günleri seçtiğim günlerden nasıl çıkaracağım? Yukarıdaki revizyona bakın. –

İlgili konular