0

假设我有这个模型:

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

现在假设 Foo 是 Bar 的内联。我总是想指出每种货币的价值?如果我可以用一个小部件替换那些货币下拉菜单,该小部件只是将名称作为带有隐藏字段的文本返回。因此,例如,在添加页面上,而不是让内联显示:

 - 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

如果您总是想使用相同的货币:

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

这里要解决的第一个问题是为每个 Bar 预先生成适当的链接 Foo。您可以在 Bar 上的自定义 save() 方法中,或使用信号,或在 BarManager 上的 Bar 工厂方法中执行此操作...

完成后,我认为您的管理问题可以这样解决:

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

您将在其中使用自定义 ReadOnlyWidget ,例如此处的那个

于 2009-11-06T17:46:26.397 回答
0

我用javascript解决了它。将以下内容插入表格或堆叠模板的顶部。它假定名称列名为名称。

{% 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 回答