admin.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. from django.contrib import admin
  2. from django import forms
  3. from .models import (
  4. Author, BinaryTree, CapoFamiglia, Chapter, ChildModel1, ChildModel2,
  5. Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
  6. Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
  7. Inner4Tabular, NonAutoPKBook, Novel, ParentModelWithCustomPk, Poll,
  8. Profile, ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness,
  9. Sighting, SomeChildModel, SomeParentModel, SottoCapo, Title,
  10. TitleCollection,
  11. )
  12. site = admin.AdminSite(name="admin")
  13. class BookInline(admin.TabularInline):
  14. model = Author.books.through
  15. class NonAutoPKBookTabularInline(admin.TabularInline):
  16. model = NonAutoPKBook
  17. class NonAutoPKBookStackedInline(admin.StackedInline):
  18. model = NonAutoPKBook
  19. class EditablePKBookTabularInline(admin.TabularInline):
  20. model = EditablePKBook
  21. class EditablePKBookStackedInline(admin.StackedInline):
  22. model = EditablePKBook
  23. class AuthorAdmin(admin.ModelAdmin):
  24. inlines = [BookInline,
  25. NonAutoPKBookTabularInline, NonAutoPKBookStackedInline,
  26. EditablePKBookTabularInline, EditablePKBookStackedInline]
  27. class InnerInline(admin.StackedInline):
  28. model = Inner
  29. can_delete = False
  30. readonly_fields = ('readonly',) # For bug #13174 tests.
  31. class HolderAdmin(admin.ModelAdmin):
  32. class Media:
  33. js = ('my_awesome_admin_scripts.js',)
  34. class ReadOnlyInlineInline(admin.TabularInline):
  35. model = ReadOnlyInline
  36. readonly_fields = ['name']
  37. class InnerInline2(admin.StackedInline):
  38. model = Inner2
  39. class Media:
  40. js = ('my_awesome_inline_scripts.js',)
  41. class InnerInline3(admin.StackedInline):
  42. model = Inner3
  43. class Media:
  44. js = ('my_awesome_inline_scripts.js',)
  45. class TitleForm(forms.ModelForm):
  46. def clean(self):
  47. cleaned_data = self.cleaned_data
  48. title1 = cleaned_data.get("title1")
  49. title2 = cleaned_data.get("title2")
  50. if title1 != title2:
  51. raise forms.ValidationError("The two titles must be the same")
  52. return cleaned_data
  53. class TitleInline(admin.TabularInline):
  54. model = Title
  55. form = TitleForm
  56. extra = 1
  57. class Inner4StackedInline(admin.StackedInline):
  58. model = Inner4Stacked
  59. show_change_link = True
  60. class Inner4TabularInline(admin.TabularInline):
  61. model = Inner4Tabular
  62. show_change_link = True
  63. class Holder4Admin(admin.ModelAdmin):
  64. inlines = [Inner4StackedInline, Inner4TabularInline]
  65. class InlineWeakness(admin.TabularInline):
  66. model = ShoppingWeakness
  67. extra = 1
  68. class QuestionInline(admin.TabularInline):
  69. model = Question
  70. readonly_fields = ['call_me']
  71. def call_me(self, obj):
  72. return 'Callable in QuestionInline'
  73. class PollAdmin(admin.ModelAdmin):
  74. inlines = [QuestionInline]
  75. def call_me(self, obj):
  76. return 'Callable in PollAdmin'
  77. class ChapterInline(admin.TabularInline):
  78. model = Chapter
  79. readonly_fields = ['call_me']
  80. def call_me(self, obj):
  81. return 'Callable in ChapterInline'
  82. class NovelAdmin(admin.ModelAdmin):
  83. inlines = [ChapterInline]
  84. class ConsigliereInline(admin.TabularInline):
  85. model = Consigliere
  86. class SottoCapoInline(admin.TabularInline):
  87. model = SottoCapo
  88. class ProfileInline(admin.TabularInline):
  89. model = Profile
  90. extra = 1
  91. # admin for #18433
  92. class ChildModel1Inline(admin.TabularInline):
  93. model = ChildModel1
  94. class ChildModel2Inline(admin.StackedInline):
  95. model = ChildModel2
  96. # admin for #19425 and #18388
  97. class BinaryTreeAdmin(admin.TabularInline):
  98. model = BinaryTree
  99. def get_extra(self, request, obj=None, **kwargs):
  100. extra = 2
  101. if obj:
  102. return extra - obj.binarytree_set.count()
  103. return extra
  104. def get_max_num(self, request, obj=None, **kwargs):
  105. max_num = 3
  106. if obj:
  107. return max_num - obj.binarytree_set.count()
  108. return max_num
  109. # admin for #19524
  110. class SightingInline(admin.TabularInline):
  111. model = Sighting
  112. # admin and form for #18263
  113. class SomeChildModelForm(forms.ModelForm):
  114. class Meta:
  115. fields = '__all__'
  116. model = SomeChildModel
  117. widgets = {
  118. 'position': forms.HiddenInput,
  119. }
  120. class SomeChildModelInline(admin.TabularInline):
  121. model = SomeChildModel
  122. form = SomeChildModelForm
  123. site.register(TitleCollection, inlines=[TitleInline])
  124. # Test bug #12561 and #12778
  125. # only ModelAdmin media
  126. site.register(Holder, HolderAdmin, inlines=[InnerInline])
  127. # ModelAdmin and Inline media
  128. site.register(Holder2, HolderAdmin, inlines=[InnerInline2])
  129. # only Inline media
  130. site.register(Holder3, inlines=[InnerInline3])
  131. site.register(Poll, PollAdmin)
  132. site.register(Novel, NovelAdmin)
  133. site.register(Fashionista, inlines=[InlineWeakness])
  134. site.register(Holder4, Holder4Admin)
  135. site.register(Author, AuthorAdmin)
  136. site.register(CapoFamiglia, inlines=[ConsigliereInline, SottoCapoInline, ReadOnlyInlineInline])
  137. site.register(ProfileCollection, inlines=[ProfileInline])
  138. site.register(ParentModelWithCustomPk, inlines=[ChildModel1Inline, ChildModel2Inline])
  139. site.register(BinaryTree, inlines=[BinaryTreeAdmin])
  140. site.register(ExtraTerrestrial, inlines=[SightingInline])
  141. site.register(SomeParentModel, inlines=[SomeChildModelInline])
  142. site.register([Question, Inner4Stacked, Inner4Tabular])