2009-09-16 48 views
23

はここに私のmodels.pyの一部です:選択項目

class Person(models.Model): 
    birth_year = WideYear(null=True, blank=True) 
    birth_year_uncertain = models.BooleanField() 
    death_year = WideYear(null=True, blank=True) 
    death_year_uncertain = models.BooleanField() 
    flourit_year = WideYear(null=True, blank=True) 
    flourit_year_uncertain = models.BooleanField() 
    FLOURIT_CHOICES = (
     (u'D', u'Birth and death dates'), 
     (u'F', u'Flourit date'), 
    ) 
    use_flourit = models.CharField('Date(s) to use', max_length=2, choices=FLOURIT_CHOICES) 
    def __unicode__(self): 
     if self.personname_set.filter(default_name__exact=True): 
      name = z(self.personname_set.filter(default_name__exact=True)[0]) 
     else: 
      name = u'[Unnamed person]' 
     if self.use_flourit == u'D': 
      dates = '%s - %s' % (z(self.birth_year), z(self.death_year)) 
     else: 
      dates = 'fl. %s' % (z(self.flourit_year)) 
     return '%s (%s)' % (name, dates) 
    class Meta: 
     ordering = ['ordering_string'] 

class PersonName(models.Model): 
    titles = models.CharField(max_length=65535, null=True, blank=True) 
    surname = models.CharField(max_length=255, null=True, blank=True) 
    first_name = models.CharField(max_length=255, null=True, blank=True) 
    middle_names = models.CharField(max_length=255, null=True, blank=True) 
    post_nominals = models.CharField(max_length=65535, null=True, blank=True) 
    default_name = models.BooleanField() 
    person = models.ForeignKey(Person, null=True, blank=True) 
    def __unicode__(self): 
     return '%s, %s %s' % (self.surname, self.first_name, self.middle_names) 
    class Meta: 
     unique_together = ("titles", "surname", "first_name", "middle_names", "post_nominals", "person") 
     unique_together = ("default_name", "person") 
post_save.connect(post_save_person_and_person_name, sender=PersonName) 

私はPersonNameのはTabularInlineとして、管理者と編集可能なインラインになりたいです。また、PersonNameのdefault_nameフィールドをラジオボタンとして表示すると、Personごとに1つのPersonNameだけがdefault_name = Trueを持つことができます。

最後の部分はハードビットです。 Djangoではフォーム内にラジオボタンのインターフェイスを持つことは比較的簡単です。本質的に、フォームセット内の1つのフォームを選択すると、はるかに難しいようです。

<入力>の要素をdefault_nameに一致させるために正規表現を使用するPersonのchange_form.htmlにJavaScriptを追加し、その1つをチェックすることで残りの部分がチェックされないようにする方法があります。しかし、これは、DjangoのHTMLフォームフィールドの命名規則が変更された場合に壊れる可能性があります。また、JavaScript対応のブラウザを使用しているユーザーのために問題を修正するだけです。

喜んで感謝していただきました。 (thisthisに基づく)

UPDATE 17/9/2009

次の管理テンプレートの拡張子は、上記のJavaScriptの提案を実装していますが、より良い解決策は歓迎されるだろう!

{% extends "admin/change_form.html" %} 

{% block extrahead %} 
    <script src="/site_media/jquery-1.3.2.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     jQuery(document).ready(function(){ 
      // Replace default_name checkboxes with radio buttons. 
      $(".default_name input").each(function(){ 
       var name = $(this).attr('name'); // grab name of original 
       var id = $(this).attr('id'); // grab id of original 
       if ($(this).attr('checked')) { // grab checked value of original 
        var checked = ' checked="checked"'; 
       } else { 
        var checked = ''; 
       } 
       /* create new visible input */ 
       var html = '<input type="radio" name="'+name+'" id="'+id+'" value="True"'+checked+' />'; 
       $(this).after(html).remove(); // add new, then remove original input 
      }); 
      // Ensure only one default_name radio button can be checked at a time. 
      $(".default_name input").click(function(){ 
       $(".default_name input").not(this).removeAttr("checked"); 
      }); 
     }); 
    </script> 
{% endblock %} 

答えて

1

私はあなたが望むことをするための従来のHTMLのみの方法は得られないと思います。

ここでは正規表現に頼る必要はありません。 Define css class in django Forms

それはしかしわずかにより良いソリューションです:私はそれは私が最初に(ここでは答え)思ったよりも難しいだと思うjQueryの...

ように、あなたの入力フィールドにクラス名を追加することはできません。