开发者

django admin foreign key field data add

开发者 https://www.devze.com 2023-03-15 11:55 出处:网络
In add form for any app in django admin, for foreign key fields of that model.. comes a dropdown list with add button(which opens in a pop-up). Can we have a form where we can add the foreign key mode

In add form for any app in django admin, for foreign key fields of that model.. comes a dropdown list with add button(which opens in a pop-up). Can we have a form where we can add the foreign key model fields in the same form.

For e.g

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

For user and contact field开发者_高级运维s a dropdown with add button is present in admin add form.Can we have all fields of user and contact in same page??


Yes, you can do that using the inline admin system.

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

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

for more details check out https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects .


There's a django add-on to get inlines in cases like this where the relationship is the opposite of the usual: django_reverse_admin

You'll need to add django_reverse_admin to your requirements.txt:

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

Then import it:

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)


the easiest approach would be something like.

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)
        


There is a library you can use it. https://github.com/daniyalzade/django_reverse_admin

But if you want to use link to object in showing table you can like this code:

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'

And in list_display:

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

精彩评论

暂无评论...
验证码 换一张
取 消