【问题标题】:readonly_fields returns empty value in django inlined modelsreadonly_fields 在 django 内联模型中返回空值
【发布时间】:2017-01-17 12:31:45
【问题描述】:

我是 django 框架的新手,在我目前的尝试中,我有两个模型(Client 和 Facture)。 Facture 在客户端更改视图中显示为 TabularInline。

我想为每个内联的facture对象显示一个链接来下载文件。所以我添加了一个自定义视图来下载facture文件,但不知道如何链接到它

class Client(models.Model):
    ...

class Facture(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    numero = models.IntegerField(unique=True, default=rand_code)
    ...

在 admin.py 中:

class FactureInline(admin.TabularInline):

    model = Facture
    extra = 0

    readonly_fields = ('numero', 'dl_link')

    def DLFacture(self, request, obj):
        ...
        response.write(pdf)
        return response

    def get_urls(self):
        urls = super(FactureAdmin, self).get_urls()
        from django.conf.urls import url
        download_url = [
            url(r'^(?P<pk>\d+)/download/$', self.admin_site.admin_view(self.DLFacture), name="download"),
        ]
        return download_url + urls

    def dl_link(self, obj):
        from django.core.urlresolvers import reverse
        return reverse("admin:clients_facture_download", args=[obj.pk])

admin.site.register(Facture, FactureAdmin)

class ClientAdmin(admin.ModelAdmin):
    inlines = [
        FactureInline,
    ]
admin.site.register(Client, ClientAdmin)

我收到以下错误:

Reverse for 'clients_facture_download' with arguments '(1,)' and keyword arguments '{}' not found. 0 pattern(s) tried: []

当我将反向网址更改为时,一切正常

reverse("admin:clients_facture_change", args=[obj.pk])

所以任何人都可以帮助我知道如何反转下载视图以及我是否认为正确?

感谢您的帮助

【问题讨论】:

    标签: python django django-admin django-views django-urls


    【解决方案1】:

    首先,您使用的是name='download',但试图反转clients_facture_download

    我会尝试更改网址

    url(r'^(?P<pk>\d+)/download/$', self.admin_site.admin_view(self.DLFacture), name="download"),
    

    url(r'^(?P<pk>\d+)/download/$', self.admin_site.admin_view(self.DLFacture), name="clients_fracture_download"),
    

    其次,InlineModelAdmin does not have get_urls 方法。你应该把它移到你的 ClientAdmin 类。

    【讨论】:

    • 它也没有用!当我在 Facture(admin.ModelAdmin) 的 list_display 中使用它时,我使用的 url 工作正常。我认为问题与 TabularInline 类的使用有关
    • 如你所说,内联类没有get_urls 方法。你应该把它移到你的模型管理类中。
    • 如果我这样做,我将如何获得facture object pk?你能写一些代码吗
    • DLFacture 作为类方法可能会使事情复杂化。我会写一个单独的方法def download_facture(request, pk):(记得更新url模式)。主键包含在网址中为pk,因此您可以使用facture = Facture.objects.get(pk=pk)
    【解决方案2】:

    我认为您需要颠倒 url 中的顺序:

    url(r'^download/(?P<pk>\d+)$', self.admin_site.admin_view(self.DLFacture), name="download"),
        ]
    

    【讨论】:

    • 它也没有用!我认为链接应该是 r'^(?P\d+)/download/$。对象更改 url 的顺序是 client/1/change/
    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多