I defined several models: Journals, volumes, volume_scanInfo etc.
A journal can have more volumes and a volume can have more scanInfo.
What I want to do is:
so I want to have something like:
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>
Then
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>
What I tried to do is defining a model method that create the code and trying to use it inside the class that defines "volume inline" in the admin, but it doesn't work.
In other words
the model "Volume" has inside something like:
def selflink(self): return '<a href="/admin/journaldb/volume/%s/">Full record</a>' % self.vid selflink.allow_tags = True
and
class VolumeInline(admin.TabularInline): fields = ['volumenumber', 'selflink'] model = Volume extra = 1
But this gives the following error:
Exception Value: 'VolumeInline.fields' refers to field 'selflink' that is missing from the form.
Any idea?
Thanks, Giovanni
UPDATE: Since Django 1.8, this is built in.
See this answer and the official documentation.
OLD ANSWER:
At the end I found a simple solution.
I create a new template called linked.html
that is a copy of tabular.html
and I added this code to create the link.
{% 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 %}
then I created a new model LinkedInline
inheriting 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()
Then when I define a new inline, I have only to use my LinkedInline
instead of the normal InlineModelAdmin
.
I hope it can be useful for other people.
Giovanni
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With