Skip to content

Commit 05b9d18

Browse files
committed
detail view for inline formset
1 parent 0b19016 commit 05b9d18

File tree

8 files changed

+79
-15
lines changed

8 files changed

+79
-15
lines changed

MANIFEST.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
include LICENSE.txt
22
include README.md
33
recursive-include crudbuilder/templates *
4+
recursive-include crudbuilder/static *
45
recursive-include crudbuilder/templatetags *
56
recursive-include docs *

crudbuilder/mixins.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ def get_actual_signal(self):
9393
return signals['instance'][view]
9494

9595

96+
class BaseDetailViewMixin(CrudBuilderMixin):
97+
def get_context_data(self, **kwargs):
98+
context = super(BaseDetailViewMixin, self).get_context_data(**kwargs)
99+
context['inlineformset'] = self.inlineformset
100+
return context
101+
102+
96103
class CreateUpdateViewMixin(CrudBuilderMixin):
97104
"""Common form_valid() method for both Create and Update views"""
98105

crudbuilder/templates/inline/detail.html

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,34 @@ <h3>{{object}}</h3>
2727
{% endfor %}
2828
</tbody>
2929
</table>
30+
31+
<hr/>
32+
33+
<h3>{{inlineformset.fk.related_query_name|title}}</h3>
34+
35+
<table class="table table-bordered">
36+
<thead>
37+
<tr>
38+
{% for field in inlineformset.form.base_fields.keys %}
39+
{% if inlineformset.fk.name != field %}
40+
<th>{{field}}</th>
41+
{% endif %}
42+
{% endfor %}
43+
</tr>
44+
</thead>
45+
<tbody>
46+
{% for object in object|inline_objects:inlineformset.fk %}
47+
<tr>
48+
{% for field in inlineformset.form.base_fields.keys %}
49+
{% if inlineformset.fk.name != field %}
50+
<td>{{object|get_value:field}}</td>
51+
{% endif %}
52+
{% endfor %}
53+
<tr>
54+
{% endfor %}
55+
</tbody>
56+
</table>
57+
58+
3059
</div>
3160
{% endblock %}

crudbuilder/templates/instance/detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ <h3>{{object}}</h3>
2727
{% endfor %}
2828
</tbody>
2929
</table>
30-
</div>s
30+
</div>
3131
{% endblock %}

crudbuilder/templatetags/tags.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ def input_with_class(value, arg):
5252
return value
5353

5454

55+
@register.filter(is_safe=True)
56+
def inline_objects(object, inline_fk):
57+
inline_model = inline_fk.model
58+
related_filter = inline_fk.get_forward_related_filter(object)
59+
return inline_model.objects.filter(**related_filter)
60+
61+
5562
@register.inclusion_tag('widgets/tables/pagination.html')
5663
def bootstrap_pagination(page, **kwargs):
5764
pagination_kwargs = kwargs.copy()

crudbuilder/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
CrudBuilderMixin,
1313
BaseListViewMixin,
1414
CreateUpdateViewMixin,
15-
InlineFormsetViewMixin
15+
InlineFormsetViewMixin,
16+
BaseDetailViewMixin
1617
)
1718
from crudbuilder.abstract import BaseBuilder
1819
from crudbuilder.tables import TableBuilder
@@ -134,10 +135,11 @@ def generate_detail_view(self):
134135
template_name=self.get_template('detail'),
135136
login_required=self.check_login_required,
136137
permissions=self.view_permission('detail'),
138+
inlineformset=self.inlineformset,
137139
permission_required=self.check_permission_required,
138140
)
139141

140-
detail_class = type(name, (CrudBuilderMixin, DetailView), detail_args)
142+
detail_class = type(name, (BaseDetailViewMixin, DetailView), detail_args)
141143
self.classes[name] = detail_class
142144
return detail_class
143145

docs/source/templates.rst

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Templates
22
=========
33

4-
By default django-crudbuilder uses its own plain html CRUD templates. You can view these templates in `template folder of crudbuilder`_ on Github.
4+
By default django-crudbuilder uses Bootstrap3 style for its CRUD templates. You can view these templates in `template folder of crudbuilder`_ on Github.
55

66

77
Use your own HTML templates for crudbuilder
@@ -10,16 +10,34 @@ Use your own HTML templates for crudbuilder
1010
You can use your own templates for the crudbuilder in following two ways:
1111

1212
5 common templates for all models CRUD
13-
########################################
14-
15-
You can create your own 5 common HTML templates for CRUD in templates/crudbuilder, then crudbuilder will use your defined templates.::
16-
17-
templates/crudbuilder
18-
object_list.html
19-
object_create.html
20-
object_update.html
21-
object_delete.html
22-
object_detail.html
13+
--------------------------------------
14+
15+
You can create your own 5 common HTML templates for CRUD in templates/crudbuilder, then crudbuilder will use your defined templates.
16+
17+
18+
Model
19+
#####
20+
21+
For single object crud.::
22+
23+
templates/crudbuilder/instance
24+
list.html
25+
create.html
26+
update.html
27+
delete.html
28+
detail.html
29+
30+
Inline Formset
31+
##############
32+
33+
For inline formset.::
34+
35+
templates/crudbuilder/inline
36+
list.html
37+
create.html
38+
update.html
39+
delete.html
40+
detail.html
2341

2442

2543
Custom templates for specific model:

example/example/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ class PersonEmployment(Audit):
4040
Person,
4141
blank=True,
4242
null=True,
43-
related_name='employments')
43+
)
4444
medical_allowance = models.BooleanField(default=False)

0 commit comments

Comments
 (0)