gpt4 book ai didi

django - 在 Django admin 中使用 raw_id_fields 添加更改页面的链接

转载 作者:行者123 更新时间:2023-12-04 18:34:52 27 4
gpt4 key购买 nike

是否有机会在 django admin 中的“raw_id_fields”旁边添加更改外键对象页面的链接?
我使用 raw_id_fields 来减少对 mysql 的查询次数。
当我不使用 raw_id_fields 时,我可以编辑或添加外键对象。

如何使用 raw_id_fields 做到这一点?

@AntoinePinsard,我尝试了第二种解决方案。字段“编辑我的 FK”已创建,但除了连字符之外什么都没有。

那是我的模型管理员。

class FlatAdmin(admin.ModelAdmin):
inlines = [NeedInline]
readonly_fields = ('flat_house_edit_link',)
raw_id_fields = ('flat_house',)
list_display = ('show_date','show_block','show_house','show_rooms','show_price','show_stage')
list_filter = ('flat_house__house_block','flat_rooms')
search_fields = ('flat_house__id',)

field = ['flat_house','flat_house_edit_link','flat_owner','flat_price','flat_rooms','flat_total_sq','flat_life_sq','flat_kitchen_sq','flat_floors']

def flat_house_edit_link(self, instance):
if instance:
fk_id = instance.user_id
else:
fk_id = None
if fk_id:
opts = instance._meta.get_field('flat_house').rel.model._meta
related_url = reverse(
'admin:{}_{}_change/?_to_field=id&_popup=1'.format(
opts.ha,
opts.house,
),
args=[fk_id],
)
return format_html(
'<a target=_blank href="{}">Go!</a>', related_url)
else:
return "No related object"
flat_house_edit_link.short_description = "Change house"
admin.site.register(Flat,FlatAdmin)

最佳答案

Note This behavior is now built-in since Django 1.10.



您可以创建一个自定义小部件来根据需要呈现此字段。
from django.contrib.admin.widgets import ForeignKeyRawIdWidget
from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.html import format_html

class ForeignKeyLinkedRawIdWidget(ForeignKeyRawIdWidget):
def render(self, name, value, attrs=None):
output = super().render(name, value, attrs)
try:
related_url = reverse(
'admin:{}_{}_change'.format(
self.rel.model._meta.app_label,
self.rel.model._meta.model_name,
),
args=[value],
)
except NoReverseMatch:
return output
return format_html('{output} <a href="{url}">edit</a>',
output=output, url=related_url)

并在您的表单中使用此小部件,而不是使用 raw_id_fields :
from myapp.forms.widgets import ForeignKeyLinkedRawIdWidget

class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
widgets = {
'my_foreignkey': ForeignKeyLinkedRawIdWidget(),
}

class MyModelAdmin(admin.ModelAdmin):
form = MyForm

但是,将其添加为“假”会简单得多 readonly_field在实际字段下方:
from django.core.urlresolvers import reverse
from django.utils.html import format_html

class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ['my_foreignkey_link']
raw_id_fields = ['my_foreignkey']
fields = [..., 'my_foreignkey', 'my_foreignkey_link', ...]

def my_foreignkey_link(self, instance):
if instance:
fk_id = instance.my_foreignkey_id
else:
fk_id = None
if fk_id:
opts = instance._meta.get_field('my_foreignkey').rel.model._meta
related_url = reverse(
'admin:{}_{}_change'.format(
opts.app_label,
opts.model_name,
),
args=[fk_id],
)
return format_html(
'<a target=_blank href="{}">Go!</a>', related_url)
else:
return "No related object"
my_foreignkey_link.short_description = "Edit My FK"

进一步阅读: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields

关于django - 在 Django admin 中使用 raw_id_fields 添加更改页面的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com