瀏覽代碼

Fixed #30520 -- Fixed crash of admin model inlines on custom fields without labels.

Jones Ambrosi 5 年之前
父節點
當前提交
f9561144d7
共有 3 個文件被更改,包括 51 次插入5 次删除
  1. 7 2
      django/contrib/admin/helpers.py
  2. 34 3
      tests/admin_inlines/admin.py
  3. 10 0
      tests/admin_inlines/tests.py

+ 7 - 2
django/contrib/admin/helpers.py

@@ -280,7 +280,12 @@ class InlineAdminFormSet:
             if not self.has_change_permission or field_name in self.readonly_fields:
                 yield {
                     'name': field_name,
-                    'label': meta_labels.get(field_name) or label_for_field(field_name, self.opts.model, self.opts),
+                    'label': meta_labels.get(field_name) or label_for_field(
+                        field_name,
+                        self.opts.model,
+                        self.opts,
+                        form=empty_form,
+                    ),
                     'widget': {'is_hidden': False},
                     'required': False,
                     'help_text': meta_help_texts.get(field_name) or help_text_for_field(field_name, self.opts.model),
@@ -289,7 +294,7 @@ class InlineAdminFormSet:
                 form_field = empty_form.fields[field_name]
                 label = form_field.label
                 if label is None:
-                    label = label_for_field(field_name, self.opts.model, self.opts)
+                    label = label_for_field(field_name, self.opts.model, self.opts, form=empty_form)
                 yield {
                     'name': field_name,
                     'label': label,

+ 34 - 3
tests/admin_inlines/admin.py

@@ -4,10 +4,10 @@ from django.db import models
 
 from .models import (
     Author, BinaryTree, CapoFamiglia, Chapter, Child, ChildModel1, ChildModel2,
-    Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
-    Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
+    Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, FootNote,
+    Holder, Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
     Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel,
-    NovelReadonlyChapter, ParentModelWithCustomPk, Poll, Profile,
+    NovelReadonlyChapter, OutfitItem, ParentModelWithCustomPk, Poll, Profile,
     ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness, Sighting,
     SomeChildModel, SomeParentModel, SottoCapo, Teacher, Title,
     TitleCollection,
@@ -131,6 +131,35 @@ class InlineWeakness(admin.TabularInline):
     extra = 1
 
 
+class WeaknessForm(forms.ModelForm):
+    extra_field = forms.CharField()
+
+    class Meta:
+        model = ShoppingWeakness
+        fields = '__all__'
+
+
+class WeaknessInlineCustomForm(admin.TabularInline):
+    model = ShoppingWeakness
+    form = WeaknessForm
+
+
+class FootNoteForm(forms.ModelForm):
+    extra_field = forms.CharField()
+
+    class Meta:
+        model = FootNote
+        fields = '__all__'
+
+
+class FootNoteNonEditableInlineCustomForm(admin.TabularInline):
+    model = FootNote
+    form = FootNoteForm
+
+    def has_change_permission(self, request, obj=None):
+        return False
+
+
 class QuestionInline(admin.TabularInline):
     model = Question
     readonly_fields = ['call_me']
@@ -271,3 +300,5 @@ site.register(ExtraTerrestrial, inlines=[SightingInline])
 site.register(SomeParentModel, inlines=[SomeChildModelInline])
 site.register([Question, Inner4Stacked, Inner4Tabular])
 site.register(Teacher, TeacherAdmin)
+site.register(Chapter, inlines=[FootNoteNonEditableInlineCustomForm])
+site.register(OutfitItem, inlines=[WeaknessInlineCustomForm])

+ 10 - 0
tests/admin_inlines/tests.py

@@ -108,6 +108,16 @@ class TestInline(TestDataMixin, TestCase):
         response = self.client.get(reverse('admin:admin_inlines_titlecollection_add'))
         self.assertContains(response, '<th class="column-title1 required">Title1</th>', html=True)
 
+    def test_custom_form_tabular_inline_extra_field_label(self):
+        response = self.client.get(reverse('admin:admin_inlines_outfititem_add'))
+        _, extra_field = list(response.context['inline_admin_formset'].fields())
+        self.assertEqual(extra_field['label'], 'Extra field')
+
+    def test_non_editable_custom_form_tabular_inline_extra_field_label(self):
+        response = self.client.get(reverse('admin:admin_inlines_chapter_add'))
+        _, extra_field = list(response.context['inline_admin_formset'].fields())
+        self.assertEqual(extra_field['label'], 'Extra field')
+
     def test_custom_form_tabular_inline_overridden_label(self):
         """
         SomeChildModelForm.__init__() overrides the label of a form field.