Я согласен, что сложно редактировать шаблоны, поэтому я создаю собственный виджет для отображения anchor
на странице просмотра изменений администратора (может использоваться как в формах, так и во встроенных).
ИтакЯ использовал виджет привязки вместе с переопределением формы, чтобы получить ссылку на странице.
forms.py:
class AnchorWidget(forms.Widget):
def _format_value(self,value):
if self.is_localized:
return formats.localize_input(value)
return value
def render(self, name, value, attrs=None):
if not value:
value = u''
text = unicode("")
if self.attrs.has_key('text'):
text = self.attrs.pop('text')
final_attrs = self.build_attrs(attrs,name=name)
return mark_safe(u"<a %s>%s</a>" %(flatatt(final_attrs),unicode(text)))
class PostAdminForm(forms.ModelForm):
.......
def __init__(self,*args,**kwargs):
super(PostAdminForm, self).__init__(*args, **kwargs)
instance = kwargs.get('instance',None)
if instance.blog:
href = reverse("admin:appname_Blog_change",args=(instance.blog))
self.fields["link"] = forms.CharField(label="View Blog",required=False,widget=AnchorWidget(attrs={'text':'go to blog','href':href}))
class BlogAdminForm(forms.ModelForm):
.......
link = forms..CharField(label="View Post",required=False,widget=AnchorWidget(attrs={'text':'go to post'}))
def __init__(self,*args,**kwargs):
super(BlogAdminForm, self).__init__(*args, **kwargs)
instance = kwargs.get('instance',None)
href = ""
if instance:
posts = Post.objects.filter(blog=instance.pk)
for idx,post in enumerate(posts):
href = reverse("admin:appname_Post_change",args=(post["id"]))
self.fields["link_%s" % idx] = forms..CharField(label=Post["name"],required=False,widget=AnchorWidget(attrs={'text':post["desc"],'href':href}))
теперь в вашем ModelAdmin
переопределите атрибут form
, и вы получите желаемый результат.Я предположил, что между этими таблицами есть отношение OneToOne
. Если у вас есть один ко многим, то сторона BlogAdmin
не будет работать.
обновление: Я внес некоторые изменения для динамического добавления ссылок, и это также решает проблему OneToMany
с Blog
до Post
, надеюсь, это решит проблему.:)
После Pastebin: В вашем PostAdmin
я заметил blog_link
, это означает, что вы пытаетесь показать ссылку blog
на changelist_view
, в которой перечислены все сообщения.Если я прав, то вы должны добавить метод, чтобы показать ссылку на странице.
class PostAdmin(admin.ModelAdmin):
model = Post
inlines = [SubPostInline, DefinitionInline]
list_display = ('__unicode__', 'enabled', 'blog_on_site')
def blog_on_site(self, obj):
href = reverse("admin:appname_Blog_change",args=(obj.blog))
return mark_safe(u"<a href='%s'>%s</a>" %(href,obj.desc))
blog_on_site.allow_tags = True
blog_on_site.short_description = 'Blog'
Насколько отображает post
ссылки на BlogAdmin
changelist_view
, вы можете сделать так же, каквыше.Мое раннее решение покажет вам ссылку на один уровень ниже на странице change_view
, где вы можете редактировать каждый экземпляр.
Если вы хотите, чтобы на странице BlogAdmin
отображались ссылки на post
в change_view
страницы, то вам нужно будет динамически включить каждую из них в fieldsets
, переопределив метод get_form
для class BlogAdmin
и добавив ссылку динамически, в get_form
установите self.fieldsets
, но сначала не используйте кортеживместо fieldsets
используйте список.