我定义了几个模型:期刊、卷、volume_scanInfo 等。

一个日志可以有更多的卷,一个卷可以有更多的 scanInfo。

我想做的是:

  • 在期刊管理页面中 我想要内联(完成)卷列表
  • 将上一个列表的每个卷连接到其管理页面,我可以在其中显示用于编辑卷及其内联“扫描信息”列表的表单。

  • 所以我想要一些类似的东西:
    Journal #1 admin page
    [name]
    [publisher]
    [url]
    .....
    list of volumes inline
        [volume 10] [..(other fields)..]   <a href="/link/to/volume/10">Full record</a>
        [volume 20] [..(other fields)..]   <a href="/link/to/volume/20">Full record</a>
    

    然后
    Volume #20 admin page
    [volume number]
    [..(other fields)...]
    ......
    list of the scan info inline
        [scan info 33] [..(other fields)..]   <a href="/link/to/scaninfo/33">Full record</a>
        [scan info 44] [..(other fields)..]   <a href="/link/to/scaninfo/44">Full record</a>
    

    我试图做的是定义一个创建代码的模型方法,并尝试在管理中定义“内联卷”的类中使用它,但它不起作用。

    换句话说

    模型“Volume”里面有类似的东西:
    def selflink(self):
        return '<a href="/admin/journaldb/volume/%s/">Full record</a>' % self.vid
    selflink.allow_tags = True
    


    class VolumeInline(admin.TabularInline):
        fields = ['volumenumber', 'selflink']
        model = Volume
        extra = 1
    

    但这会产生以下错误:
    Exception Value: 'VolumeInline.fields' refers to field 'selflink' that is missing from the form.
    

    任何想法?

    谢谢,
    乔瓦尼

    最佳答案

    更新:
    从 Django 1.8 开始,这是内置的。

    请参阅 this answerthe official documentation

    旧答案:

    最后我找到了一个简单的解决方案。

    我创建了一个名为 linked.html 的新模板,它是 tabular.html 的副本,并添加了此代码来创建链接。

    {% if inline_admin_form.original.pk %}
              <td class="{{ field.field.name }}">
                  <a href="/admin/{{ app_label }}/{{ inline_admin_formset.opts.admin_model_path }}/{{ inline_admin_form.original.pk }}/">Full record</a>
              </td>
    {% endif %}
    

    然后我创建了一个继承 LinkedInline 的新模型 InlineModelAdmin
    #override of the InlineModelAdmin to support the link in the tabular inline
    class LinkedInline(admin.options.InlineModelAdmin):
        template = "admin/linked.html"
        admin_model_path = None
    
        def __init__(self, *args):
            super(LinkedInline, self).__init__(*args)
            if self.admin_model_path is None:
                self.admin_model_path = self.model.__name__.lower()
    

    然后当我定义一个新的内联时,我只需要使用我的 LinkedInline 而不是普通的 InlineModelAdmin

    我希望它对其他人有用。

    乔瓦尼

    关于python - Django InlineModelAdmin : Show partially an inline model and link to the complete model,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15158196/

    10-12 20:17