models.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. """
  2. Testing of admin inline formsets.
  3. """
  4. from django.db import models
  5. from django.contrib import admin
  6. from django.contrib.contenttypes.models import ContentType
  7. from django.contrib.contenttypes import generic
  8. from django import forms
  9. class Parent(models.Model):
  10. name = models.CharField(max_length=50)
  11. def __unicode__(self):
  12. return self.name
  13. class Teacher(models.Model):
  14. name = models.CharField(max_length=50)
  15. def __unicode__(self):
  16. return self.name
  17. class Child(models.Model):
  18. name = models.CharField(max_length=50)
  19. teacher = models.ForeignKey(Teacher)
  20. content_type = models.ForeignKey(ContentType)
  21. object_id = models.PositiveIntegerField()
  22. parent = generic.GenericForeignKey()
  23. def __unicode__(self):
  24. return u'I am %s, a child of %s' % (self.name, self.parent)
  25. class Book(models.Model):
  26. name = models.CharField(max_length=50)
  27. class Author(models.Model):
  28. name = models.CharField(max_length=50)
  29. books = models.ManyToManyField(Book)
  30. class BookInline(admin.TabularInline):
  31. model = Author.books.through
  32. class AuthorAdmin(admin.ModelAdmin):
  33. inlines = [BookInline]
  34. admin.site.register(Author, AuthorAdmin)
  35. class Holder(models.Model):
  36. dummy = models.IntegerField()
  37. class Inner(models.Model):
  38. dummy = models.IntegerField()
  39. holder = models.ForeignKey(Holder)
  40. readonly = models.CharField("Inner readonly label", max_length=1)
  41. class InnerInline(admin.StackedInline):
  42. model = Inner
  43. can_delete = False
  44. readonly_fields = ('readonly',) # For bug #13174 tests.
  45. class Holder2(models.Model):
  46. dummy = models.IntegerField()
  47. class Inner2(models.Model):
  48. dummy = models.IntegerField()
  49. holder = models.ForeignKey(Holder2)
  50. class HolderAdmin(admin.ModelAdmin):
  51. class Media:
  52. js = ('my_awesome_admin_scripts.js',)
  53. class InnerInline2(admin.StackedInline):
  54. model = Inner2
  55. class Media:
  56. js = ('my_awesome_inline_scripts.js',)
  57. class Holder3(models.Model):
  58. dummy = models.IntegerField()
  59. class Inner3(models.Model):
  60. dummy = models.IntegerField()
  61. holder = models.ForeignKey(Holder3)
  62. class InnerInline3(admin.StackedInline):
  63. model = Inner3
  64. class Media:
  65. js = ('my_awesome_inline_scripts.js',)
  66. # Test bug #12561 and #12778
  67. # only ModelAdmin media
  68. admin.site.register(Holder, HolderAdmin, inlines=[InnerInline])
  69. # ModelAdmin and Inline media
  70. admin.site.register(Holder2, HolderAdmin, inlines=[InnerInline2])
  71. # only Inline media
  72. admin.site.register(Holder3, inlines=[InnerInline3])
  73. # Models for #12749
  74. class Person(models.Model):
  75. firstname = models.CharField(max_length=15)
  76. class OutfitItem(models.Model):
  77. name = models.CharField(max_length=15)
  78. class Fashionista(models.Model):
  79. person = models.OneToOneField(Person, primary_key=True)
  80. weaknesses = models.ManyToManyField(OutfitItem, through='ShoppingWeakness', blank=True)
  81. class ShoppingWeakness(models.Model):
  82. fashionista = models.ForeignKey(Fashionista)
  83. item = models.ForeignKey(OutfitItem)
  84. class InlineWeakness(admin.TabularInline):
  85. model = ShoppingWeakness
  86. extra = 1
  87. admin.site.register(Fashionista, inlines=[InlineWeakness])
  88. # Models for #13510
  89. class TitleCollection(models.Model):
  90. pass
  91. class Title(models.Model):
  92. collection = models.ForeignKey(TitleCollection, blank=True, null=True)
  93. title1 = models.CharField(max_length=100)
  94. title2 = models.CharField(max_length=100)
  95. class TitleForm(forms.ModelForm):
  96. def clean(self):
  97. cleaned_data = self.cleaned_data
  98. title1 = cleaned_data.get("title1")
  99. title2 = cleaned_data.get("title2")
  100. if title1 != title2:
  101. raise forms.ValidationError("The two titles must be the same")
  102. return cleaned_data
  103. class TitleInline(admin.TabularInline):
  104. model = Title
  105. form = TitleForm
  106. extra = 1
  107. admin.site.register(TitleCollection, inlines=[TitleInline])
  108. # Models for #15424
  109. class Poll(models.Model):
  110. name = models.CharField(max_length=40)
  111. class Question(models.Model):
  112. poll = models.ForeignKey(Poll)
  113. class QuestionInline(admin.TabularInline):
  114. model = Question
  115. readonly_fields=['call_me']
  116. def call_me(self, obj):
  117. return 'Callable in QuestionInline'
  118. class PollAdmin(admin.ModelAdmin):
  119. inlines = [QuestionInline]
  120. def call_me(self, obj):
  121. return 'Callable in PollAdmin'
  122. class Novel(models.Model):
  123. name = models.CharField(max_length=40)
  124. class Chapter(models.Model):
  125. novel = models.ForeignKey(Novel)
  126. class ChapterInline(admin.TabularInline):
  127. model = Chapter
  128. readonly_fields=['call_me']
  129. def call_me(self, obj):
  130. return 'Callable in ChapterInline'
  131. class NovelAdmin(admin.ModelAdmin):
  132. inlines = [ChapterInline]
  133. admin.site.register(Poll, PollAdmin)
  134. admin.site.register(Novel, NovelAdmin)