Home > Backend Development > Python Tutorial > Djangoadminsite(三)InlineModelAdmin

Djangoadminsite(三)InlineModelAdmin

黄舟
Release: 2016-12-23 17:46:14
Original
1997 people have browsed it

InlineModelAdmin

class InlineModelAdmin
class TabularInline
class StackedInline

For example, there are two Models:

from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=100)

If you want to edit book on the Author page:

from django.contrib import admin

class BookInline(admin.TabularInline):
model = Book

class AuthorAdmin(admin.ModelAdmin):
inlines = [
, BookInline,
]

Django provides two subclasses of InlineModelAdmin:

TabularInline
StackedInline
The difference is the template used.

InlineModelAdmin options

The options common to InlineModelAdmin and ModelAdmin are:

form
fieldsets
fields
formfield_overrides
exclude
filter_horizontal
filter_vertical
ordering
PRepopulated_fields
get_queryset()
radio_fields
readonly_fields
raw_id_fields
formfield_for_choice_field()
formfield_for_foreignkey ()
formfield_for_manytomany()
has_add_permission()
has_change_permission()
has_delete_permission()

Additional options are:

InlineModelAdmin.model
The model used inline, required.

InlineModelAdmin.fk_name
The name of the model, used when there are multiple foreign keys.

InlineModelAdmin.formset
Default BaseInlineFormSet.

InlineModelAdmin.form
Default ModelForm. Passed to inlineformset_factory() when creating the formset.

InlineModelAdmin.extra
Extra number of inline.

InlineModelAdmin.get_extra() also returns the extra number of inline.

InlineModelAdmin.max_num
The maximum number that can be displayed.

InlineModelAdmin.get_max_num() also returns this number.

InlineModelAdmin.min_num
The minimum number that can be displayed.

InlineModelAdmin.get_min_num() also returns this number.

InlineModelAdmin.raw_id_fields
Same as ModelAdmin.

class BookInline(admin.TabularInline):
model = Book
raw_id_fields = ("pages",)

InlineModelAdmin.template
The template used.

InlineModelAdmin.verbose_name
overrides verbose_name in meta class.

InlineModelAdmin.verbose_name_plural
Same as above

InlineModelAdmin.can_delete
Defaults to True.

InlineModelAdmin.get_formset(request, obj=None, **kwargs)
Refer to ModelAdmin.get_formsets_with_inlines.

InlineModelAdmin.get_extra(request, obj=None, **kwargs)

class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree

def get_extra(self, request, obj=None, **kwargs):
extra = 2
if obj:
return extra - obj.binarytree_set.count()
return extra

InlineModelAdmin.get_max_num(request , obj=None, **kwargs)

class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree

def get_max_num(self, request, obj=None, **kwargs):
max_num = 10
if obj .parent :
              return max_num - 5
                                                  using using using  .             out out through off through off ’s ’ through ’ s ’ through through ‐ ‐ ‐ ‐‐ ‐ back , return max_num to 5
‐ ‐ ‐ ‐ return max_num


InlineModelAdmin.get_min_num(request, obj=None, **kwargs)

See above.

The case of multiple ForeignKeys linking to the same Model

If there are multiple foreign keys:


from django.db import models

class Friendship(models.Model):
to_person = models.ForeignKey(Person, related_name= "friends")
from_person = models.ForeignKey(Person, related_name="from_friends")

Show one of them:


from django.contrib import admin
from myapp.models import Friendship

class FriendshipInline(admin.TabularInline) :
model = Friendship
fk_name = "to_person"

class PersonAdmin(admin.ModelAdmin):
inlines = [
FriendshipInline,
]

Working with many-to-many models

model example :


from django .db import models

class Person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members = models .ManyToManyField(Person, related_name='groups')

inlines display: 🎜

from django.contrib import admin

class MembershipInline(admin.TabularInline):
model = Group.members.through

class PersonAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]

class GroupAdmin(admin .ModelAdmin):
inlines = [
MembershipInline,
]
exclude = ('members',)

Note:

First, the MembershipInline class points to Group.members.through. The through attribute points to the management of the many- to-many relationship database.

Second, the GroupAdmin must exclude the members field.

Working with many-to-many intermediary models

Explicitly indicate the intermediate model example:

from django.db import models

class Person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length =64)

First step:

class MembershipInline(admin.TabularInline):
model = Membership
extra = 1

Second step:

class PersonAdmin(admin.ModelAdmin):
inlines = (MembershipInline ,)

class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)

Step 3:

admin.site.register(Person, PersonAdmin)
admin.site.register(Group, GroupAdmin)

Using generic relations as an inline

An example of inline with generically related objects:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey

class Image(models.Model):
image = models.ImageField(upload_to="images")
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey("content_type", "object_id")

class Product(models.Model):
name = models.CharField(max_length=100)

If you want to edit the Image instance on the Product add/change page, you can use GenericTabularInline or GenericStackedInline:

from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline

from myproject.myapp.models import Image, Product

class ImageInline(GenericTabularInline):
model = Image

class ProductAdmin(admin.ModelAdmin):
inlines = [
ImageInline,
]

admin.site .register(Product, ProductAdmin)

The above is the content of Djangoadminsite (3) InlineModelAdmin. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!


source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template