tôi đã xây dựng khác khá giải pháp chung chung ...
trong admin.py bạn thêm một lĩnh vực mới để Inline của bạn:
class YourModelInline(admin.TabularInline):
model = YourModel
after_field = "fieldname_of_field_before_inline"
Sau đó tùy chỉnh render_change_form của AdminClas s của mô hình chứa Inline:
class EditModelAdmin(model.ModelAdmin):
inlines = [YourModelInline,]
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
sorted_inline_formsets = {}
inline_admin_formsets = context['inline_admin_formsets']
formsets_to_remove = []
for inline_formset in inline_admin_formsets:
if hasattr(inline_formset.opts, 'after_field'):
fieldname = inline_formset.opts.after_field
if fieldname in sorted_inline_formsets:
sorted_inline_formsets[fieldname].append(inline_formset)
else:
sorted_inline_formsets.update({
fieldname: [inline_formset,]
})
formsets_to_remove.append(inline_formset)
for inline_formset in formsets_to_remove:
inline_admin_formsets.remove(inline_formset)
context.update({
'sorted_inline_formsets': sorted_inline_formsets,
'inline_admin_formsets': inline_admin_formsets
})
return super(EditModelAdmin, self).render_change_form(request, context, add=add,
change=change, obj=obj, form_url=form_url)
Chúng tôi đang di chuyển tất cả inlines với trường bổ sung vào từ điển riêng với fieldname như chìa khóa ... Đối với nó để được trả lại một cách chính xác tạo tập tin/templates/admin/includes/fieldset.html ghi đè fieldset django chuẩn.html với nội dung sau:
{% load custom_filter %}
<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
<div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
{% for field in line %}
<div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
{% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }}
{% else %}
{{ field.label_tag }}
{% if field.is_readonly %}
<div class="readonly">{{ field.contents }}</div>
{% else %}
{{ field.field }}
{% endif %}
{% endif %}
{% if field.field.help_text %}
<div class="help">{{ field.field.help_text|safe }}</div>
{% endif %}
</div>
{% if field.field.name %}
{% with field.field.name as fieldname %}
{% if sorted_inline_formsets|get_dict_value:fieldname != False %}
{% for inline_admin_formset in sorted_inline_formsets|get_dict_value:fieldname %}
{% include inline_admin_formset.opts.template %}
{% endfor %}
{% endif %}
{% endwith %}
{% endif %}
{% endfor %}
</div>
{% endfor %}
</fieldset>
này sẽ thêm inlines được sắp xếp sau khi lĩnh vực tương ứng ... Bây giờ bạn chỉ cần custom_filter để làm việc với từ điển trong mẫu django, tạo templatetags/custom_filter. py và thêm:
@register.filter
def get_dict_value(dict, key):
if key in dict:
return dict[key]
else:
return False
và thì đấy: bạn có thể nhập bất kỳ fieldname vào bất kỳ Inline để thêm nó sau khi lĩnh vực mà ... đó là một công việc chút để thiết lập nhưng nếu bạn có một vài inlines để sắp xếp nó có thể là một cách sạch hơn ...
Một cách giải quyết khác gọn gàng hơn trong một số trường hợp - và bẩn hơn ở những người khác - sẽ sử dụng jQuery để di chuyển nội tuyến. –
@andybak với giới hạn hiện tại, sử dụng jquery sẽ là một cách giải quyết rõ ràng. – elsadek
Bạn cũng có thể tạo fieldset cho chính nội tuyến, nếu nó không phải là một phần của bộ trường gốc. Đó là những gì tôi đã được sau khi anyways. – radtek