0

私がこのモデルを持っているとしましょう:

class Foo(models.Model):
    bar = models.ForeignKey(Bar)
    currency = models.ForeignKey(Currency) # currency is just an example
    is_active = models.BooleanField()

ここで、Fooがインラインのバーであるとします。そして、私は常に各通貨の値を示したいですか?これらの通貨のドロップダウンメニューを、名前をテキストとして非表示のフィールドで返すウィジェットに置き換えることができれば。したがって、たとえば、追加ページで、インラインに次のように表示させる代わりに、次のようにします。

 - currency drop down menu    is_active checkbox 
 - currency drop down menu    is_active checkbox 
 - currency drop down menu    is_active checkbox 

これを表示させます:

 - currency name 1    is_active checkbox 
 - currency name 2    is_active checkbox 
 - currency name 3    is_active checkbox 
 - currency name 4    is_active checkbox 
 - currency name 5    is_active checkbox 

それを達成するための正しいアプローチは何でしょうか?フォームクラスのメソッドをオーバーライドする必要があると思います。ありがとう。

4

3 に答える 3

0

javascriptで解決しました。以下を表形式または積み上げテンプレートの上部に挿入します。name 列の名前は name であると想定しています。

{% with inline_admin_formset.opts as i %}
    {% if i.pre_filled %}
        <script language="JavaScript" type="text/javascript">
        jQuery(function($) {    
            var pre_values = [
            {% for name in i.pre_filled %}
                {% if forloop.last %}
                [{{ name.id }}, "{{ name.name }}"] 
                {% else %}
                [{{ name.id }}, "{{ name.name }}"],    
                {% endif %}
            {% endfor %}
            ];

            $.each( pre_values,
                function( i, value ){
                    $('div.inline-group div.tabular').each(function() {
                        $("#id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").after(value[1]);
                        $("#id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").val(value[0]).hide();
                        $("#lookup_id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").hide();    
                        $("strong").hide();
                    });
                }
            );
        }); 
        </script>
    {% endif %}
{% endwith %}

そして、これは inline.py に入ります:

class MyCustomInline(admin.TabularInline):
    pre_filled = []
    pre_field = ''

    def get_fieldsets(self, request, obj=None): 
        if not obj and self.pre_filled and self.pre_field:
            count = self.pre_filled.count()
            self.extra = count
            self.max_num = count
            if self.raw_id_fields:
                self.raw_id_fields.append(self.pre_field)
            else:
                self.raw_id_fields = [self.pre_field]

        return super(MyCustomInline, self).get_fieldsets(request, obj)

class FooInline(MyCustomInline):
    model = Foo
    pre_filled = Currency.objects.all()
    pre_field = 'currency'
于 2009-11-10T03:35:28.643 に答える
0

常に同じ通貨を使用したい場合:

currency = models.ForeignKey(Currency, default = lambda: Currency.objects.get(...)

オンザフライで通貨を変更したい場合は、フォームをサブクラス化し、initをオーバーライドして魔法を実行できますself.fields['currency']

フィールドを非表示にする場合widget = forms.HiddenInput()は、フォーム クラスのそのフィールドで使用します。

それはあなたの質問に答えると思いますが、あなたの本当の問題ではありません。[django-currencies][1] を使用して通貨を柔軟に処理します。

[1] : http://code.google.com/p/django-currencies/django-currencies

于 2009-11-06T09:08:10.063 に答える
0

ここで解決する最初の問題は、各バーに適切なリンクされた Foo を事前に生成することです。Bar のカスタム save() メソッドで、またはシグナルを使用して、または BarManager の Bar ファクトリ メソッドでそれを行うことができます...

それが完了したら、管理者の問題は次のように解決できると思います。

class FooInline(admin.TabularInline):
    formfield_overrides = {models.ModelChoiceField: {'widget': ReadOnlyWidget}}
    model = Foo
    extra = 0

here のようなカスタム ReadOnlyWidget を使用する場所。

于 2009-11-06T17:46:26.397 に答える