PythonDjango 1.11尝试更新FK字段时管理操作中的“ValueError Incomplete format”

2024-09-24 22:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的主/明细模型报价单(主)包含标题信息和总计,以及报价单明细(明细)包含报价单项目,此子模型有一个PriceLevel FK字段,用于计算每个单项的加价。我试图实现一个Django管理操作,以便管理员可以同时更改多个项目的此价格级别,但我得到错误:

[myProjectPath]\lib\site-packages\django\contrib\admin\options.py", line 812, in get_action_choices
    choice = (name, description % model_format_dict(self.opts))
ValueError: incomplete format

这是我的模型.py(在相关车型上):

^{pr2}$

这是我的py管理员:(我也尝试了操作的注释版本,但结果出现了相同的错误)。能够从FK模型中为这个更改选择选项是很好的,但是我将通过两个操作来实现它的工作:一个将标记值增加0.05%,另一个将标记值降低0.05%,在这种情况下,我需要更新标记字段。在

class CotizacionDetalleAdminForm(forms.ModelForm):
    class Meta:
        model = CotizacionDetalle
        fields = ['item', 'cotizacion', 'cantidad', 'nivel_de_precio']


def cambiar_utilidad(modeladmin, request, queryset):
    from .models import NivelDePrecio
    ndp = NivelDePrecio.objects.get(id=5)
    queryset.update(nivel_de_precio_id=ndp.id)
    # for cd in queryset:
    #     cd.nivel_de_precio_id = ndp.id
    #     cd.save()


cambiar_utilidad.short_description = "Cambiar Utilidad 25%"


class CotizacionDetalleAdmin(admin.ModelAdmin):
    # save_as = True
    form = CotizacionDetalleAdminForm
    list_display = ['cliente', 'itinerario', 'cotizacion', 'descripcion',
                    'cantidad', 'costo', 'monto', 'utilidad', 'markup', 'total']
    list_display_links = ['descripcion']
    readonly_fields = ['descripcion', 'costo', 'monto', 'utilidad', 'markup', 'total', 'slug', 'creado', 'actualizado']
    search_fields = ['descripcion']
    list_filter = (('cotizacion__itinerario__cliente', DropdownFilterRelated),
                   ('cotizacion__itinerario', DropdownFilterRelated),
                   ('cotizacion', DropdownFilterRelated),)
    ordering = ['cotizacion__itinerario__cliente__codigo', 'cotizacion__fecha_ida', 'id']
    actions = [cambiar_utilidad]


admin.site.register(CotizacionDetalle, CotizacionDetalleAdmin)

更新:

…试过了:

https://djangosnippets.org/snippets/1836/

我的py管理员

def create_action_nivel(nivel):
    def action(modeladmin, request, queryset):
        queryset.update(nivel_de_precio=nivel)

    name = "change_to_%s" % (nivel.slug,)
    return (name, (action, name, "Cambiar Nivel de Precio a: %s" % (nivel,)))

。。。在

class CotizacionDetalleAdmin(admin.ModelAdmin):

    def get_actions(self, request):
        return dict(create_action_nivel(n) for n in NivelDePrecio.objects.all())

但是我得到了同样的错误,回溯显示在这里:http://dpaste.com/360GEJY

当要更新的字段不是外键字段时,相同的代码段也可以正常工作。我在另一个模型中使用了它,效果很好:

def create_action_estatus(estatus):
    def action(modeladmin, request, queryset):
        queryset.update(estatus=estatus)

    name = "mark_%s" % (estatus,)
    return name, (action, name, "Cambiar Estatus: %s " % (estatus,))


class ItinerarioAdmin(admin.ModelAdmin):
    def get_actions(self, request):
        statuses= [ "Solicitado", "Cotizado", "Confirmado", "Facturado", "Cerrado"]
        return dict(create_action_estatus(e) for e in statuses)

Tags: namepy模型idadminrequestdefde
1条回答
网友
1楼 · 发布于 2024-09-24 22:20:41

我发现了一个错误,经过多次尝试,问题在于在描述字段的内容中使用%符号,显然是在创建时 管理操作动态地重用short_description生成的字符串,如果其中有一个%符号,则抛出不完整格式错误。在

解决方案是构建简短的描述字符串,如下所示:

cambiar_nivel.short_description = "Cambiar Nivel de Precio a {0:.1f}%%".format(nivel.valor * 100)

…注意(转义的)双%符号

相关问题 更多 >