models.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import tempfile
  4. import os
  5. from django.contrib import admin
  6. from django.core.files.storage import FileSystemStorage
  7. from django.contrib.admin.views.main import ChangeList
  8. from django.core.mail import EmailMessage
  9. from django.db import models
  10. from django import forms
  11. from django.forms.models import BaseModelFormSet
  12. from django.contrib.auth.models import User
  13. from django.contrib.contenttypes import generic
  14. from django.contrib.contenttypes.models import ContentType
  15. class Section(models.Model):
  16. """
  17. A simple section that links to articles, to test linking to related items
  18. in admin views.
  19. """
  20. name = models.CharField(max_length=100)
  21. class Article(models.Model):
  22. """
  23. A simple article to test admin views. Test backwards compatibility.
  24. """
  25. title = models.CharField(max_length=100)
  26. content = models.TextField()
  27. date = models.DateTimeField()
  28. section = models.ForeignKey(Section, null=True, blank=True)
  29. def __unicode__(self):
  30. return self.title
  31. def model_year(self):
  32. return self.date.year
  33. model_year.admin_order_field = 'date'
  34. model_year.short_description = ''
  35. class Book(models.Model):
  36. """
  37. A simple book that has chapters.
  38. """
  39. name = models.CharField(max_length=100, verbose_name=u'¿Name?')
  40. def __unicode__(self):
  41. return self.name
  42. class Promo(models.Model):
  43. name = models.CharField(max_length=100, verbose_name=u'¿Name?')
  44. book = models.ForeignKey(Book)
  45. def __unicode__(self):
  46. return self.name
  47. class Chapter(models.Model):
  48. title = models.CharField(max_length=100, verbose_name=u'¿Title?')
  49. content = models.TextField()
  50. book = models.ForeignKey(Book)
  51. def __unicode__(self):
  52. return self.title
  53. class Meta:
  54. # Use a utf-8 bytestring to ensure it works (see #11710)
  55. verbose_name = '¿Chapter?'
  56. class ChapterXtra1(models.Model):
  57. chap = models.OneToOneField(Chapter, verbose_name=u'¿Chap?')
  58. xtra = models.CharField(max_length=100, verbose_name=u'¿Xtra?')
  59. def __unicode__(self):
  60. return u'¿Xtra1: %s' % self.xtra
  61. class ChapterXtra2(models.Model):
  62. chap = models.OneToOneField(Chapter, verbose_name=u'¿Chap?')
  63. xtra = models.CharField(max_length=100, verbose_name=u'¿Xtra?')
  64. def __unicode__(self):
  65. return u'¿Xtra2: %s' % self.xtra
  66. def callable_year(dt_value):
  67. return dt_value.year
  68. callable_year.admin_order_field = 'date'
  69. class ArticleInline(admin.TabularInline):
  70. model = Article
  71. class ChapterInline(admin.TabularInline):
  72. model = Chapter
  73. class ChapterXtra1Admin(admin.ModelAdmin):
  74. list_filter = ('chap',
  75. 'chap__title',
  76. 'chap__book',
  77. 'chap__book__name',
  78. 'chap__book__promo',
  79. 'chap__book__promo__name',)
  80. class ArticleAdmin(admin.ModelAdmin):
  81. list_display = ('content', 'date', callable_year, 'model_year', 'modeladmin_year')
  82. list_filter = ('date', 'section')
  83. def changelist_view(self, request):
  84. "Test that extra_context works"
  85. return super(ArticleAdmin, self).changelist_view(
  86. request, extra_context={
  87. 'extra_var': 'Hello!'
  88. }
  89. )
  90. def modeladmin_year(self, obj):
  91. return obj.date.year
  92. modeladmin_year.admin_order_field = 'date'
  93. modeladmin_year.short_description = None
  94. def delete_model(self, request, obj):
  95. EmailMessage(
  96. 'Greetings from a deleted object',
  97. 'I hereby inform you that some user deleted me',
  98. 'from@example.com',
  99. ['to@example.com']
  100. ).send()
  101. return super(ArticleAdmin, self).delete_model(request, obj)
  102. def save_model(self, request, obj, form, change=True):
  103. EmailMessage(
  104. 'Greetings from a created object',
  105. 'I hereby inform you that some user created me',
  106. 'from@example.com',
  107. ['to@example.com']
  108. ).send()
  109. return super(ArticleAdmin, self).save_model(request, obj, form, change)
  110. class RowLevelChangePermissionModel(models.Model):
  111. name = models.CharField(max_length=100, blank=True)
  112. class RowLevelChangePermissionModelAdmin(admin.ModelAdmin):
  113. def has_change_permission(self, request, obj=None):
  114. """ Only allow changing objects with even id number """
  115. return request.user.is_staff and (obj is not None) and (obj.id % 2 == 0)
  116. class CustomArticle(models.Model):
  117. content = models.TextField()
  118. date = models.DateTimeField()
  119. class CustomArticleAdmin(admin.ModelAdmin):
  120. """
  121. Tests various hooks for using custom templates and contexts.
  122. """
  123. change_list_template = 'custom_admin/change_list.html'
  124. change_form_template = 'custom_admin/change_form.html'
  125. add_form_template = 'custom_admin/add_form.html'
  126. object_history_template = 'custom_admin/object_history.html'
  127. delete_confirmation_template = 'custom_admin/delete_confirmation.html'
  128. delete_selected_confirmation_template = 'custom_admin/delete_selected_confirmation.html'
  129. def changelist_view(self, request):
  130. "Test that extra_context works"
  131. return super(CustomArticleAdmin, self).changelist_view(
  132. request, extra_context={
  133. 'extra_var': 'Hello!'
  134. }
  135. )
  136. class ModelWithStringPrimaryKey(models.Model):
  137. id = models.CharField(max_length=255, primary_key=True)
  138. def __unicode__(self):
  139. return self.id
  140. class Color(models.Model):
  141. value = models.CharField(max_length=10)
  142. warm = models.BooleanField()
  143. def __unicode__(self):
  144. return self.value
  145. class Thing(models.Model):
  146. title = models.CharField(max_length=20)
  147. color = models.ForeignKey(Color, limit_choices_to={'warm': True})
  148. def __unicode__(self):
  149. return self.title
  150. class ThingAdmin(admin.ModelAdmin):
  151. list_filter = ('color__warm', 'color__value')
  152. class Actor(models.Model):
  153. name = models.CharField(max_length=50)
  154. age = models.IntegerField()
  155. def __unicode__(self):
  156. return self.name
  157. class Inquisition(models.Model):
  158. expected = models.BooleanField()
  159. leader = models.ForeignKey(Actor)
  160. country = models.CharField(max_length=20)
  161. def __unicode__(self):
  162. return u"by %s from %s" % (self.leader, self.country)
  163. class InquisitionAdmin(admin.ModelAdmin):
  164. list_display = ('leader', 'country', 'expected')
  165. class Sketch(models.Model):
  166. title = models.CharField(max_length=100)
  167. inquisition = models.ForeignKey(Inquisition, limit_choices_to={'leader__name': 'Palin',
  168. 'leader__age': 27,
  169. 'expected': False,
  170. })
  171. def __unicode__(self):
  172. return self.title
  173. class SketchAdmin(admin.ModelAdmin):
  174. raw_id_fields = ('inquisition',)
  175. class Fabric(models.Model):
  176. NG_CHOICES = (
  177. ('Textured', (
  178. ('x', 'Horizontal'),
  179. ('y', 'Vertical'),
  180. )
  181. ),
  182. ('plain', 'Smooth'),
  183. )
  184. surface = models.CharField(max_length=20, choices=NG_CHOICES)
  185. class FabricAdmin(admin.ModelAdmin):
  186. list_display = ('surface',)
  187. list_filter = ('surface',)
  188. class Person(models.Model):
  189. GENDER_CHOICES = (
  190. (1, "Male"),
  191. (2, "Female"),
  192. )
  193. name = models.CharField(max_length=100)
  194. gender = models.IntegerField(choices=GENDER_CHOICES)
  195. age = models.IntegerField(default=21)
  196. alive = models.BooleanField()
  197. def __unicode__(self):
  198. return self.name
  199. class Meta:
  200. ordering = ["id"]
  201. class BasePersonModelFormSet(BaseModelFormSet):
  202. def clean(self):
  203. for person_dict in self.cleaned_data:
  204. person = person_dict.get('id')
  205. alive = person_dict.get('alive')
  206. if person and alive and person.name == "Grace Hopper":
  207. raise forms.ValidationError, "Grace is not a Zombie"
  208. class PersonAdmin(admin.ModelAdmin):
  209. list_display = ('name', 'gender', 'alive')
  210. list_editable = ('gender', 'alive')
  211. list_filter = ('gender',)
  212. search_fields = ('^name',)
  213. ordering = ["id"]
  214. save_as = True
  215. def get_changelist_formset(self, request, **kwargs):
  216. return super(PersonAdmin, self).get_changelist_formset(request,
  217. formset=BasePersonModelFormSet, **kwargs)
  218. class Persona(models.Model):
  219. """
  220. A simple persona associated with accounts, to test inlining of related
  221. accounts which inherit from a common accounts class.
  222. """
  223. name = models.CharField(blank=False, max_length=80)
  224. def __unicode__(self):
  225. return self.name
  226. class Account(models.Model):
  227. """
  228. A simple, generic account encapsulating the information shared by all
  229. types of accounts.
  230. """
  231. username = models.CharField(blank=False, max_length=80)
  232. persona = models.ForeignKey(Persona, related_name="accounts")
  233. servicename = u'generic service'
  234. def __unicode__(self):
  235. return "%s: %s" % (self.servicename, self.username)
  236. class FooAccount(Account):
  237. """A service-specific account of type Foo."""
  238. servicename = u'foo'
  239. class BarAccount(Account):
  240. """A service-specific account of type Bar."""
  241. servicename = u'bar'
  242. class FooAccountAdmin(admin.StackedInline):
  243. model = FooAccount
  244. extra = 1
  245. class BarAccountAdmin(admin.StackedInline):
  246. model = BarAccount
  247. extra = 1
  248. class PersonaAdmin(admin.ModelAdmin):
  249. inlines = (
  250. FooAccountAdmin,
  251. BarAccountAdmin
  252. )
  253. class Subscriber(models.Model):
  254. name = models.CharField(blank=False, max_length=80)
  255. email = models.EmailField(blank=False, max_length=175)
  256. def __unicode__(self):
  257. return "%s (%s)" % (self.name, self.email)
  258. class SubscriberAdmin(admin.ModelAdmin):
  259. actions = ['mail_admin']
  260. def mail_admin(self, request, selected):
  261. EmailMessage(
  262. 'Greetings from a ModelAdmin action',
  263. 'This is the test email from a admin action',
  264. 'from@example.com',
  265. ['to@example.com']
  266. ).send()
  267. class ExternalSubscriber(Subscriber):
  268. pass
  269. class OldSubscriber(Subscriber):
  270. pass
  271. def external_mail(modeladmin, request, selected):
  272. EmailMessage(
  273. 'Greetings from a function action',
  274. 'This is the test email from a function action',
  275. 'from@example.com',
  276. ['to@example.com']
  277. ).send()
  278. def redirect_to(modeladmin, request, selected):
  279. from django.http import HttpResponseRedirect
  280. return HttpResponseRedirect('/some-where-else/')
  281. class ExternalSubscriberAdmin(admin.ModelAdmin):
  282. actions = [external_mail, redirect_to]
  283. class Media(models.Model):
  284. name = models.CharField(max_length=60)
  285. class Podcast(Media):
  286. release_date = models.DateField()
  287. class PodcastAdmin(admin.ModelAdmin):
  288. list_display = ('name', 'release_date')
  289. list_editable = ('release_date',)
  290. date_hierarchy = 'release_date'
  291. ordering = ('name',)
  292. class Vodcast(Media):
  293. media = models.OneToOneField(Media, primary_key=True, parent_link=True)
  294. released = models.BooleanField(default=False)
  295. class VodcastAdmin(admin.ModelAdmin):
  296. list_display = ('name', 'released')
  297. list_editable = ('released',)
  298. ordering = ('name',)
  299. class Parent(models.Model):
  300. name = models.CharField(max_length=128)
  301. class Child(models.Model):
  302. parent = models.ForeignKey(Parent, editable=False)
  303. name = models.CharField(max_length=30, blank=True)
  304. class ChildInline(admin.StackedInline):
  305. model = Child
  306. class ParentAdmin(admin.ModelAdmin):
  307. model = Parent
  308. inlines = [ChildInline]
  309. class EmptyModel(models.Model):
  310. def __unicode__(self):
  311. return "Primary key = %s" % self.id
  312. class EmptyModelAdmin(admin.ModelAdmin):
  313. def queryset(self, request):
  314. return super(EmptyModelAdmin, self).queryset(request).filter(pk__gt=1)
  315. class OldSubscriberAdmin(admin.ModelAdmin):
  316. actions = None
  317. temp_storage = FileSystemStorage(tempfile.mkdtemp())
  318. UPLOAD_TO = os.path.join(temp_storage.location, 'test_upload')
  319. class Gallery(models.Model):
  320. name = models.CharField(max_length=100)
  321. class Picture(models.Model):
  322. name = models.CharField(max_length=100)
  323. image = models.FileField(storage=temp_storage, upload_to='test_upload')
  324. gallery = models.ForeignKey(Gallery, related_name="pictures")
  325. class PictureInline(admin.TabularInline):
  326. model = Picture
  327. extra = 1
  328. class GalleryAdmin(admin.ModelAdmin):
  329. inlines = [PictureInline]
  330. class PictureAdmin(admin.ModelAdmin):
  331. pass
  332. class Language(models.Model):
  333. iso = models.CharField(max_length=5, primary_key=True)
  334. name = models.CharField(max_length=50)
  335. english_name = models.CharField(max_length=50)
  336. shortlist = models.BooleanField(default=False)
  337. class Meta:
  338. ordering = ('iso',)
  339. class LanguageAdmin(admin.ModelAdmin):
  340. list_display = ['iso', 'shortlist', 'english_name', 'name']
  341. list_editable = ['shortlist']
  342. # a base class for Recommender and Recommendation
  343. class Title(models.Model):
  344. pass
  345. class TitleTranslation(models.Model):
  346. title = models.ForeignKey(Title)
  347. text = models.CharField(max_length=100)
  348. class Recommender(Title):
  349. pass
  350. class Recommendation(Title):
  351. recommender = models.ForeignKey(Recommender)
  352. class RecommendationAdmin(admin.ModelAdmin):
  353. search_fields = ('=titletranslation__text', '=recommender__titletranslation__text',)
  354. class Collector(models.Model):
  355. name = models.CharField(max_length=100)
  356. class Widget(models.Model):
  357. owner = models.ForeignKey(Collector)
  358. name = models.CharField(max_length=100)
  359. class DooHickey(models.Model):
  360. code = models.CharField(max_length=10, primary_key=True)
  361. owner = models.ForeignKey(Collector)
  362. name = models.CharField(max_length=100)
  363. class Grommet(models.Model):
  364. code = models.AutoField(primary_key=True)
  365. owner = models.ForeignKey(Collector)
  366. name = models.CharField(max_length=100)
  367. class Whatsit(models.Model):
  368. index = models.IntegerField(primary_key=True)
  369. owner = models.ForeignKey(Collector)
  370. name = models.CharField(max_length=100)
  371. class Doodad(models.Model):
  372. name = models.CharField(max_length=100)
  373. class FancyDoodad(Doodad):
  374. owner = models.ForeignKey(Collector)
  375. expensive = models.BooleanField(default=True)
  376. class WidgetInline(admin.StackedInline):
  377. model = Widget
  378. class DooHickeyInline(admin.StackedInline):
  379. model = DooHickey
  380. class GrommetInline(admin.StackedInline):
  381. model = Grommet
  382. class WhatsitInline(admin.StackedInline):
  383. model = Whatsit
  384. class FancyDoodadInline(admin.StackedInline):
  385. model = FancyDoodad
  386. class Category(models.Model):
  387. collector = models.ForeignKey(Collector)
  388. order = models.PositiveIntegerField()
  389. class Meta:
  390. ordering = ('order',)
  391. def __unicode__(self):
  392. return u'%s:o%s' % (self.id, self.order)
  393. class CategoryAdmin(admin.ModelAdmin):
  394. list_display = ('id', 'collector', 'order')
  395. list_editable = ('order',)
  396. class CategoryInline(admin.StackedInline):
  397. model = Category
  398. class CollectorAdmin(admin.ModelAdmin):
  399. inlines = [
  400. WidgetInline, DooHickeyInline, GrommetInline, WhatsitInline,
  401. FancyDoodadInline, CategoryInline
  402. ]
  403. class Link(models.Model):
  404. posted = models.DateField(
  405. default=lambda: datetime.date.today() - datetime.timedelta(days=7)
  406. )
  407. url = models.URLField()
  408. post = models.ForeignKey("Post")
  409. class LinkInline(admin.TabularInline):
  410. model = Link
  411. extra = 1
  412. readonly_fields = ("posted",)
  413. class Post(models.Model):
  414. title = models.CharField(max_length=100, help_text="Some help text for the title (with unicode ŠĐĆŽćžšđ)")
  415. content = models.TextField(help_text="Some help text for the content (with unicode ŠĐĆŽćžšđ)")
  416. posted = models.DateField(
  417. default=datetime.date.today,
  418. help_text="Some help text for the date (with unicode ŠĐĆŽćžšđ)"
  419. )
  420. public = models.NullBooleanField()
  421. def awesomeness_level(self):
  422. return "Very awesome."
  423. class PostAdmin(admin.ModelAdmin):
  424. list_display = ['title', 'public']
  425. readonly_fields = ('posted', 'awesomeness_level', 'coolness', 'value', lambda obj: "foo")
  426. inlines = [
  427. LinkInline
  428. ]
  429. def coolness(self, instance):
  430. if instance.pk:
  431. return "%d amount of cool." % instance.pk
  432. else:
  433. return "Unkown coolness."
  434. def value(self, instance):
  435. return 1000
  436. value.short_description = 'Value in $US'
  437. class Gadget(models.Model):
  438. name = models.CharField(max_length=100)
  439. def __unicode__(self):
  440. return self.name
  441. class CustomChangeList(ChangeList):
  442. def get_query_set(self):
  443. return self.root_query_set.filter(pk=9999) # Does not exist
  444. class GadgetAdmin(admin.ModelAdmin):
  445. def get_changelist(self, request, **kwargs):
  446. return CustomChangeList
  447. class Villain(models.Model):
  448. name = models.CharField(max_length=100)
  449. def __unicode__(self):
  450. return self.name
  451. class SuperVillain(Villain):
  452. pass
  453. class FunkyTag(models.Model):
  454. "Because we all know there's only one real use case for GFKs."
  455. name = models.CharField(max_length=25)
  456. content_type = models.ForeignKey(ContentType)
  457. object_id = models.PositiveIntegerField()
  458. content_object = generic.GenericForeignKey('content_type', 'object_id')
  459. def __unicode__(self):
  460. return self.name
  461. class Plot(models.Model):
  462. name = models.CharField(max_length=100)
  463. team_leader = models.ForeignKey(Villain, related_name='lead_plots')
  464. contact = models.ForeignKey(Villain, related_name='contact_plots')
  465. tags = generic.GenericRelation(FunkyTag)
  466. def __unicode__(self):
  467. return self.name
  468. class PlotDetails(models.Model):
  469. details = models.CharField(max_length=100)
  470. plot = models.OneToOneField(Plot)
  471. def __unicode__(self):
  472. return self.details
  473. class SecretHideout(models.Model):
  474. """ Secret! Not registered with the admin! """
  475. location = models.CharField(max_length=100)
  476. villain = models.ForeignKey(Villain)
  477. def __unicode__(self):
  478. return self.location
  479. class SuperSecretHideout(models.Model):
  480. """ Secret! Not registered with the admin! """
  481. location = models.CharField(max_length=100)
  482. supervillain = models.ForeignKey(SuperVillain)
  483. def __unicode__(self):
  484. return self.location
  485. class CyclicOne(models.Model):
  486. name = models.CharField(max_length=25)
  487. two = models.ForeignKey('CyclicTwo')
  488. def __unicode__(self):
  489. return self.name
  490. class CyclicTwo(models.Model):
  491. name = models.CharField(max_length=25)
  492. one = models.ForeignKey(CyclicOne)
  493. def __unicode__(self):
  494. return self.name
  495. class Topping(models.Model):
  496. name = models.CharField(max_length=20)
  497. class Pizza(models.Model):
  498. name = models.CharField(max_length=20)
  499. toppings = models.ManyToManyField('Topping')
  500. class PizzaAdmin(admin.ModelAdmin):
  501. readonly_fields = ('toppings',)
  502. class Album(models.Model):
  503. owner = models.ForeignKey(User)
  504. title = models.CharField(max_length=30)
  505. class AlbumAdmin(admin.ModelAdmin):
  506. list_filter = ['title']
  507. class Employee(Person):
  508. code = models.CharField(max_length=20)
  509. class WorkHour(models.Model):
  510. datum = models.DateField()
  511. employee = models.ForeignKey(Employee)
  512. class WorkHourAdmin(admin.ModelAdmin):
  513. list_display = ('datum', 'employee')
  514. list_filter = ('employee',)
  515. class Question(models.Model):
  516. question = models.CharField(max_length=20)
  517. class Answer(models.Model):
  518. question = models.ForeignKey(Question, on_delete=models.PROTECT)
  519. answer = models.CharField(max_length=20)
  520. def __unicode__(self):
  521. return self.answer
  522. class Reservation(models.Model):
  523. start_date = models.DateTimeField()
  524. price = models.IntegerField()
  525. DRIVER_CHOICES = (
  526. (u'bill', 'Bill G'),
  527. (u'steve', 'Steve J'),
  528. )
  529. RESTAURANT_CHOICES = (
  530. (u'indian', u'A Taste of India'),
  531. (u'thai', u'Thai Pography'),
  532. (u'pizza', u'Pizza Mama'),
  533. )
  534. class FoodDelivery(models.Model):
  535. reference = models.CharField(max_length=100)
  536. driver = models.CharField(max_length=100, choices=DRIVER_CHOICES, blank=True)
  537. restaurant = models.CharField(max_length=100, choices=RESTAURANT_CHOICES, blank=True)
  538. class Meta:
  539. unique_together = (("driver", "restaurant"),)
  540. class FoodDeliveryAdmin(admin.ModelAdmin):
  541. list_display=('reference', 'driver', 'restaurant')
  542. list_editable = ('driver', 'restaurant')
  543. class Paper(models.Model):
  544. title = models.CharField(max_length=30)
  545. author = models.CharField(max_length=30, blank=True, null=True)
  546. class CoverLetter(models.Model):
  547. author = models.CharField(max_length=30)
  548. date = models.DateField(null=True, blank=True)
  549. def __unicode__(self):
  550. return self.author
  551. class PaperAdmin(admin.ModelAdmin):
  552. """
  553. A ModelAdin with a custom queryset() method that uses only(), to test
  554. verbose_name display in messages shown after adding Paper instances.
  555. """
  556. def queryset(self, request):
  557. return super(PaperAdmin, self).queryset(request).only('title')
  558. class CoverLetterAdmin(admin.ModelAdmin):
  559. """
  560. A ModelAdin with a custom queryset() method that uses only(), to test
  561. verbose_name display in messages shown after adding CoverLetter instances.
  562. Note that the CoverLetter model defines a __unicode__ method.
  563. """
  564. def queryset(self, request):
  565. #return super(CoverLetterAdmin, self).queryset(request).only('author')
  566. return super(CoverLetterAdmin, self).queryset(request).defer('date')
  567. class Story(models.Model):
  568. title = models.CharField(max_length=100)
  569. content = models.TextField()
  570. class StoryForm(forms.ModelForm):
  571. class Meta:
  572. widgets = {'title': forms.HiddenInput}
  573. class StoryAdmin(admin.ModelAdmin):
  574. list_display = ('id', 'title', 'content')
  575. list_display_links = ('title',) # 'id' not in list_display_links
  576. list_editable = ('content', )
  577. form = StoryForm
  578. class OtherStory(models.Model):
  579. title = models.CharField(max_length=100)
  580. content = models.TextField()
  581. class OtherStoryAdmin(admin.ModelAdmin):
  582. list_display = ('id', 'title', 'content')
  583. list_display_links = ('title', 'id') # 'id' in list_display_links
  584. list_editable = ('content', )
  585. admin.site.register(Article, ArticleAdmin)
  586. admin.site.register(CustomArticle, CustomArticleAdmin)
  587. admin.site.register(Section, save_as=True, inlines=[ArticleInline])
  588. admin.site.register(ModelWithStringPrimaryKey)
  589. admin.site.register(Color)
  590. admin.site.register(Thing, ThingAdmin)
  591. admin.site.register(Actor)
  592. admin.site.register(Inquisition, InquisitionAdmin)
  593. admin.site.register(Sketch, SketchAdmin)
  594. admin.site.register(Person, PersonAdmin)
  595. admin.site.register(Persona, PersonaAdmin)
  596. admin.site.register(Subscriber, SubscriberAdmin)
  597. admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
  598. admin.site.register(OldSubscriber, OldSubscriberAdmin)
  599. admin.site.register(Podcast, PodcastAdmin)
  600. admin.site.register(Vodcast, VodcastAdmin)
  601. admin.site.register(Parent, ParentAdmin)
  602. admin.site.register(EmptyModel, EmptyModelAdmin)
  603. admin.site.register(Fabric, FabricAdmin)
  604. admin.site.register(Gallery, GalleryAdmin)
  605. admin.site.register(Picture, PictureAdmin)
  606. admin.site.register(Language, LanguageAdmin)
  607. admin.site.register(Recommendation, RecommendationAdmin)
  608. admin.site.register(Recommender)
  609. admin.site.register(Collector, CollectorAdmin)
  610. admin.site.register(Category, CategoryAdmin)
  611. admin.site.register(Post, PostAdmin)
  612. admin.site.register(Gadget, GadgetAdmin)
  613. admin.site.register(Villain)
  614. admin.site.register(SuperVillain)
  615. admin.site.register(Plot)
  616. admin.site.register(PlotDetails)
  617. admin.site.register(CyclicOne)
  618. admin.site.register(CyclicTwo)
  619. admin.site.register(WorkHour, WorkHourAdmin)
  620. admin.site.register(Reservation)
  621. admin.site.register(FoodDelivery, FoodDeliveryAdmin)
  622. admin.site.register(RowLevelChangePermissionModel, RowLevelChangePermissionModelAdmin)
  623. admin.site.register(Paper, PaperAdmin)
  624. admin.site.register(CoverLetter, CoverLetterAdmin)
  625. admin.site.register(Story, StoryAdmin)
  626. admin.site.register(OtherStory, OtherStoryAdmin)
  627. # We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
  628. # That way we cover all four cases:
  629. # related ForeignKey object registered in admin
  630. # related ForeignKey object not registered in admin
  631. # related OneToOne object registered in admin
  632. # related OneToOne object not registered in admin
  633. # when deleting Book so as exercise all four troublesome (w.r.t escaping
  634. # and calling force_unicode to avoid problems on Python 2.3) paths through
  635. # contrib.admin.util's get_deleted_objects function.
  636. admin.site.register(Book, inlines=[ChapterInline])
  637. admin.site.register(Promo)
  638. admin.site.register(ChapterXtra1, ChapterXtra1Admin)
  639. admin.site.register(Pizza, PizzaAdmin)
  640. admin.site.register(Topping)
  641. admin.site.register(Album, AlbumAdmin)
  642. admin.site.register(Question)
  643. admin.site.register(Answer)