Rumah pembangunan bahagian belakang Tutorial Python Djangoadminsite(三)InlineModelAdmin

Djangoadminsite(三)InlineModelAdmin

Dec 23, 2016 pm 05:46 PM

InlineModelAdmin

class InlineModelAdmin
class TabularInline
class StackedInline

举例,有两个Model:

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)

如果想在Author页面上编辑book:

from django.contrib import admin

class BookInline(admin.TabularInline):
   model = Book

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

Django提供了两个InlineModelAdmin的子类:

TabularInline
StackedInline
区别在于使用的模板。

InlineModelAdmin options选项

InlineModelAdmin和ModelAdmin共通的options有:

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()

额外增加的options有:

InlineModelAdmin.model
inline使用的model,必需。

InlineModelAdmin.fk_name
model的name,当有多个外键时使用。

InlineModelAdmin.formset
缺省BaseInlineFormSet。

InlineModelAdmin.form
缺省ModelForm。当创建formset时传递给inlineformset_factory()。

InlineModelAdmin.extra
inline的额外数目。

InlineModelAdmin.get_extra()也返回inline的额外数目。

InlineModelAdmin.max_num
可展示得最大数目。

InlineModelAdmin.get_max_num()也返回此数字。

InlineModelAdmin.min_num
可展示的最小数目。

InlineModelAdmin.get_min_num()也返回此数目。

InlineModelAdmin.raw_id_fields
同ModelAdmin。

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

InlineModelAdmin.template
使用的模板。

InlineModelAdmin.verbose_name
覆盖meta class中的verbose_name。

InlineModelAdmin.verbose_name_plural
同上

InlineModelAdmin.can_delete
默认为True。

InlineModelAdmin.get_formset(request, obj=None, **kwargs)
参考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
       return max_num

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

多个 ForeignKey链向同一个Model的情况

如果有多个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")

展示其中一个:

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例子:

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展示:

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:

第一 , the MembershipInline类指向Group.members.through. The through attribute指向管理the many-to-many关系的数据库. 

第二,, the GroupAdmin 必须排除the members字段.

Working with many-to-many intermediary models

明确指出中间model的例子:

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)

第一步:

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

第二步:

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

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

第三步:

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

Using generic relations as an inline

一个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)

如果想在Product add/change页面上编辑Image实例,可以使用GenericTabularInline或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)

 以上就是Djangoadminsite(三)InlineModelAdmin的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Apr 01, 2025 pm 05:09 PM

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Apr 01, 2025 pm 11:15 PM

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Mar 21, 2025 pm 06:46 PM

Artikel ini membincangkan perpustakaan Python yang popular seperti Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask, dan Permintaan, memperincikan kegunaan mereka dalam pengkomputeran saintifik, analisis data, visualisasi, pembelajaran mesin, pembangunan web, dan h

Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Apr 01, 2025 pm 10:51 PM

Bagaimanakah Uvicorn terus mendengar permintaan HTTP? Uvicorn adalah pelayan web ringan berdasarkan ASGI. Salah satu fungsi terasnya ialah mendengar permintaan HTTP dan teruskan ...

Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Apr 01, 2025 pm 11:18 PM

Di Python, bagaimana untuk membuat objek secara dinamik melalui rentetan dan panggil kaedahnya? Ini adalah keperluan pengaturcaraan yang biasa, terutamanya jika perlu dikonfigurasikan atau dijalankan ...

Apakah ungkapan biasa? Apakah ungkapan biasa? Mar 20, 2025 pm 06:25 PM

Ekspresi biasa adalah alat yang berkuasa untuk memadankan corak dan manipulasi teks dalam pengaturcaraan, meningkatkan kecekapan dalam pemprosesan teks merentasi pelbagai aplikasi.

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Apr 02, 2025 am 07:18 AM

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

See all articles