django管理外键字段数据添加

7rtdyuoh  于 2023-02-17  发布在  Go
关注(0)|答案(4)|浏览(211)

在django admin的任何应用程序的添加表单中,对于该模型的外键字段,都会有一个带有添加按钮的下拉列表(在弹出窗口中打开)。我们可以在同一个表单中添加外键模型字段吗?
例如

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    contact = models.ForeignKey(Contact, blank=True, null=True)

对于用户和联系人字段,在管理员添加表单中有一个添加按钮的下拉列表。我们可以在同一页中包含用户和联系人的所有字段吗?

bd1hkmkf

bd1hkmkf1#

是的,你可以使用内嵌管理系统来完成。

class UserAdmin(admin.StackedInline):
    model = User
class ContactAdmin(admin.StackedInline):
    model = Contact

class UserProfileAdmin(admin.ModelAdmin):
    inlines = [ UserAdmin, ContactAdmin ]

有关详细信息,请访问https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects。

mkshixfv

mkshixfv2#

有一个django插件可以在这种关系与通常相反的情况下获得内联:django_reverse_admin
您需要将django_reverse_admin添加到您的requirements.txt文件中:

-e git+https://github.com/anziem/django_reverse_admin.git#egg=django_reverse_admin

然后导入:
admin.py

from django_reverse_admin import ReverseModelAdmin

class UserProfileAdmin(ReverseModelAdmin):
    inline_reverse = ['user', 'contact']
    inline_type = 'tabular'  # or could be 'stacked'

admin.site.register(UserProfile, UserProfileAdmin)
weylhg0b

weylhg0b3#

最简单的方法是这样的。

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    contact = models.ForeignKey(Contact, blank=True, null=True)

# Then in the admin create the custom admin view
from .models import Contact

class CustomAdminUserProfile(admin.ModelAdmin):
    list_display = ['contact', 'get_contact_additional_field']

    def get_contact_additional_field(self, obj):
        queryset = Contact.objects.filter(name=obj.name)[0]
        additional_field = queryset.additional_field
        return additional_field

#Then you register
admin.site.register(Contact, CustomAdminUserProfile)
qni6mghb

qni6mghb4#

有一个库可以使用。https://github.com/daniyalzade/django_reverse_admin
但如果你想使用链接到显示表中的对象,你可以喜欢这个代码:

def user_link(self, obj):
    if obj.user:
        reverse_link = 'admin:%s_%s_change' % (
            obj.user._meta.app_label, obj.user._meta.model_name)
        link = reverse(reverse_link, args=[obj.user.id])
        return format_html('<a href="%s">More detail</a>' % link)
    return format_html('<span >-</span>')

user_link.allow_tags = True
user_link.short_description = 'User Info'

在列表显示中:

list_display = (...,user_link,...)

相关问题