|
1 from django.db import models |
|
2 from django.contrib import admin |
|
3 from django.contrib.contenttypes import generic |
|
4 from django.contrib.contenttypes.models import ContentType |
|
5 |
|
6 class Episode(models.Model): |
|
7 name = models.CharField(max_length=100) |
|
8 |
|
9 class Media(models.Model): |
|
10 """ |
|
11 Media that can associated to any object. |
|
12 """ |
|
13 content_type = models.ForeignKey(ContentType) |
|
14 object_id = models.PositiveIntegerField() |
|
15 content_object = generic.GenericForeignKey() |
|
16 url = models.URLField(verify_exists=False) |
|
17 |
|
18 def __unicode__(self): |
|
19 return self.url |
|
20 |
|
21 class MediaInline(generic.GenericTabularInline): |
|
22 model = Media |
|
23 |
|
24 class EpisodeAdmin(admin.ModelAdmin): |
|
25 inlines = [ |
|
26 MediaInline, |
|
27 ] |
|
28 admin.site.register(Episode, EpisodeAdmin) |
|
29 |
|
30 # |
|
31 # These models let us test the different GenericInline settings at |
|
32 # different urls in the admin site. |
|
33 # |
|
34 |
|
35 # |
|
36 # Generic inline with extra = 0 |
|
37 # |
|
38 |
|
39 class EpisodeExtra(Episode): |
|
40 pass |
|
41 |
|
42 class MediaExtraInline(generic.GenericTabularInline): |
|
43 model = Media |
|
44 extra = 0 |
|
45 |
|
46 admin.site.register(EpisodeExtra, inlines=[MediaExtraInline]) |
|
47 |
|
48 # |
|
49 # Generic inline with extra and max_num |
|
50 # |
|
51 |
|
52 class EpisodeMaxNum(Episode): |
|
53 pass |
|
54 |
|
55 class MediaMaxNumInline(generic.GenericTabularInline): |
|
56 model = Media |
|
57 extra = 5 |
|
58 max_num = 2 |
|
59 |
|
60 admin.site.register(EpisodeMaxNum, inlines=[MediaMaxNumInline]) |
|
61 |
|
62 # |
|
63 # Generic inline with exclude |
|
64 # |
|
65 |
|
66 class EpisodeExclude(Episode): |
|
67 pass |
|
68 |
|
69 class MediaExcludeInline(generic.GenericTabularInline): |
|
70 model = Media |
|
71 exclude = ['url'] |
|
72 |
|
73 admin.site.register(EpisodeExclude, inlines=[MediaExcludeInline]) |
|
74 |
|
75 # |
|
76 # Generic inline with unique_together |
|
77 # |
|
78 |
|
79 class PhoneNumber(models.Model): |
|
80 content_type = models.ForeignKey(ContentType) |
|
81 object_id = models.PositiveIntegerField() |
|
82 content_object = generic.GenericForeignKey('content_type', 'object_id') |
|
83 phone_number = models.CharField(max_length=30) |
|
84 |
|
85 class Meta: |
|
86 unique_together = (('content_type', 'object_id', 'phone_number',),) |
|
87 |
|
88 class Contact(models.Model): |
|
89 name = models.CharField(max_length=50) |
|
90 phone_numbers = generic.GenericRelation(PhoneNumber) |
|
91 |
|
92 class PhoneNumberInline(generic.GenericTabularInline): |
|
93 model = PhoneNumber |
|
94 |
|
95 admin.site.register(Contact, inlines=[PhoneNumberInline]) |
|
96 |
|
97 # |
|
98 # Generic inline with can_delete=False |
|
99 # |
|
100 |
|
101 class EpisodePermanent(Episode): |
|
102 pass |
|
103 |
|
104 class MediaPermanentInline(generic.GenericTabularInline): |
|
105 model = Media |
|
106 can_delete = False |
|
107 |
|
108 admin.site.register(EpisodePermanent, inlines=[MediaPermanentInline]) |