2009-03-09 11 views
2

私はこれに関する質問をしていました。しかし、私は直接私の質問をする方が良いと思う。 私は、 "ドメイン"と "グループ"の2つのテーブルとmanytomanyの関係を持つ "User"テーブルを持っています。 管理インターフェースでは、2つのModelMultipleChoiceFieldsとしてグループとドメインが表示されます。 しかし、よりユーザーフレンドリーな方法でUIにそれらを提示したいと思います。 ユーザーのプロパティに応じて選択/選択解除されたチェックボックスを使用して、ドメインとグループに使用可能な選択肢をそれぞれ表示します。 私はこれをadminで行うことができるのだろうと思っていたのですが、私は管理者から独立した自分のビューを作成する必要があります。Djangoフォーム

答えて

2

私は内蔵のウィジェットCheckboxSelectMultipleはあなたが望むことをすると思います。そうでない場合は、独自のウィジェットを作成する必要があります。 documentation for widgetsは良い出発点です。 Djangoのソースから既存のウィジェットをコピーして変更することで簡単に始めることができます。

0

私はあなたが何をしようとしているのか分かりませんが、おそらくfilter_horizontalのようなものがあなたの望むことをするでしょう。

1

実際には管理者がデフォルトでモデルフォームを使用しています。だから、あなたはそれを上書きする必要があります。

from django import forms 
from django.forms import widgets 

class DomainForm(forms.ModelForm): 

    field2 = YourField(widget=widgets.CheckboxSelectMultiple) 

    class Meta: 
     model = Domain() 
     fields = ('field1', 'field2') 

この場合、デフォルトのFIELD2フィールドタイプを上書きしています。

+0

を変更することができます-1私は、単一のCheckboxInputは、多対多分野のために働くために起こっているとは思いません。 –

+0

今すぐお試しください! – aatifh

2

正確には、Django管理者がManyToManyFieldの場合に表示するように選択したウィジェットです。 この場合、あなたが感じるSelectMultipleウィジェットは、使い勝手が悪いです。

あなたのモデルフォームを使用している間は、いつでもウィジェットを選択できます。 しかし、Django管理者の場合は、往復が必要です。これをチェックしてください。

from django.forms import widgets 
from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
    """ 
    Get a form Field for a ManyToManyField. 
    """ 
    # If it uses an intermediary model, don't show field in admin. 
    if db_field.rel.through is not None: 
     return None 

    if db_field.name in self.raw_id_fields: 
     kwargs['widget'] = admin.widgets.ManyToManyRawIdWidget(db_field.rel) 
     kwargs['help_text'] = '' 
    elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)): 
     kwargs['widget'] = admin.widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical)) 
    else: 
     kwargs['widget'] = widgets.CheckboxSelectMultiple() 
     kwargs['help_text'] = '' 

    return db_field.formfield(**kwargs) 

さて、あなたは今、Djangoの管理者のチェックボックスを取得します

class SomeModelAdmin(MyModelAdmin): 
    search_fields = ['foo', 'bar'] 
    list_display = ('foo',) 
    ordering  = ('-bar',) 

admin.site.register(SomeModel, SomeModelAdmin) 

としてadmin.pyであなたの日常管理を定義します。もちろん、CSSの変更が必要になります。

0

あなたはDjangoの管理インタフェースフィールドウィジェット

from django.forms import widgets 

class UserAdmin(admin.ModelAdmin): 
    model = User 

    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
     if db_field.name == 'domain' or db_field.name == 'groups': 
     kwargs['widget'] = widgets.CheckboxSelectMultiple() 

     # or just make all the manytomany fields as checkbox 

     kwargs['widget'] = widgets.CheckboxSelectMultiple() 

     return db_field.formfield(**kwargs) 

    # for other field 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     ..... 
     return super(UserAdmin, self).formfield_for_dbfield(db_field, **kwargs) 

admin.site.register(User, UserAdmin)