1 | --- django/db/models/base.py 2006-06-27 15:08:19.000000000 -0300
|
---|
2 | +++ django/db/models/base.py 2006-06-27 15:35:35.000000000 -0300
|
---|
3 | @@ -150,6 +150,45 @@
|
---|
4 |
|
---|
5 | if hasattr(cls, 'get_absolute_url'):
|
---|
6 | cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url)
|
---|
7 | +
|
---|
8 | + # Retrieves the list of fields with related objects
|
---|
9 | + # (Foreign keys)
|
---|
10 | + fk_fields = [x for x in cls._meta.fields if x.rel]
|
---|
11 | + thiscls_fqn = "%s.%s" % (cls.__module__,cls.__name__)
|
---|
12 | + for field in fk_fields:
|
---|
13 | + # Retrieve model that is related to the field
|
---|
14 | + rel_model = field.rel.to
|
---|
15 | + # Check if the related model as a inline_models field
|
---|
16 | + if not hasattr(rel_model,'_meta'):
|
---|
17 | + continue
|
---|
18 | + if rel_model._meta.admin:
|
---|
19 | + for inline_info in rel_model._meta.admin.inline_models:
|
---|
20 | + model_fqn = inline_info['model']
|
---|
21 | + if not '.' in model_fqn:
|
---|
22 | + model_fqn = "%s.%s" % (cls.__module__,model_fqn)
|
---|
23 | + # There this model is defined in the related model's
|
---|
24 | + # inline_models entry
|
---|
25 | + if model_fqn == thiscls_fqn:
|
---|
26 | + # Set edit_inline and other attributes in the model
|
---|
27 | + # According to the inline_models entry
|
---|
28 | + rel_fieldname = inline_info.get('related_field',None)
|
---|
29 | + # The field name can be set with the 'related_field'
|
---|
30 | + # argument
|
---|
31 | + if rel_fieldname:
|
---|
32 | + rel_field = cls._meta.get_field(rel_fieldname)
|
---|
33 | + else:
|
---|
34 | + fields = [x for x in cls._meta.fields if x.rel]
|
---|
35 | + rel_field = [x for x in fields if x.rel.to==rel_model][0]
|
---|
36 | + for key,val in inline_info.iteritems():
|
---|
37 | + if key=='type':
|
---|
38 | + rel_field.rel.edit_inline = val
|
---|
39 | + elif key=='fields':
|
---|
40 | + for field in cls._meta.fields:
|
---|
41 | + if field.name != rel_field.name:
|
---|
42 | + field.core = field.name in val
|
---|
43 | + elif hasattr(rel_field.rel,key):
|
---|
44 | + setattr(rel_field.rel,key,val)
|
---|
45 | +
|
---|
46 |
|
---|
47 | dispatcher.send(signal=signals.class_prepared, sender=cls)
|
---|
48 | diff -ur --exclude-from=exc django_src/django/db/models/options.py django_src_new/django/db/models/options.py
|
---|
49 | --- django/db/models/options.py 2006-06-27 13:31:39.000000000 -0300
|
---|
50 | +++ django/db/models/options.py 2006-06-27 10:25:18.000000000 -0300
|
---|
51 | @@ -201,7 +201,8 @@
|
---|
52 | class AdminOptions(object):
|
---|
53 | def __init__(self, fields=None, js=None, list_display=None, list_filter=None,
|
---|
54 | date_hierarchy=None, save_as=False, ordering=None, search_fields=None,
|
---|
55 | - save_on_top=False, list_select_related=False, manager=None, list_per_page=100):
|
---|
56 | + save_on_top=False, list_select_related=False, manager=None, list_per_page=100,
|
---|
57 | + inline_models=[]):
|
---|
58 | self.fields = fields
|
---|
59 | self.js = js or []
|
---|
60 | self.list_display = list_display or ['__str__']
|
---|
61 | @@ -212,6 +213,7 @@
|
---|
62 | self.save_on_top = save_on_top
|
---|
63 | self.list_select_related = list_select_related
|
---|
64 | self.list_per_page = list_per_page
|
---|
65 | + self.inline_models = inline_models
|
---|
66 | self.manager = manager or Manager()
|
---|
67 |
|
---|
68 | def get_field_sets(self, opts):
|
---|
69 | diff -ru --exclude-from=exc django_src_new/docs/model-api.txt django_src/docs/model-api.txt
|
---|
70 | --- django/docs/model-api.txt 2006-06-27 10:16:10.000000000 -0300
|
---|
71 | +++ django/docs/model-api.txt 2006-06-27 14:00:53.000000000 -0300
|
---|
72 | @@ -1176,6 +1176,34 @@
|
---|
73 | under the heading of the fieldset. It's used verbatim, so you can use any HTML
|
---|
74 | and you must escape any special HTML characters (such as ampersands) yourself.
|
---|
75 |
|
---|
76 | +``inline_models``
|
---|
77 | +-----------------
|
---|
78 | +A list of dicts that define which related models should be edited inline with
|
---|
79 | +the given model. It's a cleaner alternative to edit_inline, with the
|
---|
80 | +following differences:
|
---|
81 | + - You define the model with the 'model' keyword argument. You have to use
|
---|
82 | + the model as a ``string``, not the ``class``.
|
---|
83 | + - You can use the 'related_field' keyword to define the related model's
|
---|
84 | + ForeignKey that will be used, or leave Django to catch the first
|
---|
85 | + ForeignKey field to the parent model.
|
---|
86 | + - Instead of the 'edit_inline' keyword, you use the 'type' keyword.
|
---|
87 | + - Instead of specifying core=True in each field you want to show in
|
---|
88 | + the inline admin, you use the 'fields' keyword argument, which is
|
---|
89 | + a list of fields
|
---|
90 | +All other options can be used, e.g. ``min_num_in_admin``.
|
---|
91 | +
|
---|
92 | +Example::
|
---|
93 | + inline_models = (
|
---|
94 | + {'model':'InlineModel',
|
---|
95 | + 'type':models.TABULAR,
|
---|
96 | + 'min_num_in_admin':1,
|
---|
97 | + 'num_extra_on_change':1,
|
---|
98 | + 'fields':('field1','field2','field3')
|
---|
99 | + },
|
---|
100 | + )
|
---|
101 | +
|
---|
102 | +Check the ``edit_inline`` section for more arguments on this option.
|
---|
103 | +
|
---|
104 | ``js``
|
---|
105 | ------
|
---|
106 |
|
---|