mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.6.x] Fixed #13696 -- ensured inline pk field is rendered
Backport of 3aad955ea8 from master.
			
			
This commit is contained in:
		| @@ -266,10 +266,12 @@ class InlineAdminForm(AdminForm): | |||||||
|             yield InlineFieldset(self.formset, self.form, name, |             yield InlineFieldset(self.formset, self.form, name, | ||||||
|                 self.readonly_fields, model_admin=self.model_admin, **options) |                 self.readonly_fields, model_admin=self.model_admin, **options) | ||||||
|  |  | ||||||
|     def has_auto_field(self): |     def needs_explicit_pk_field(self): | ||||||
|         if self.form._meta.model._meta.has_auto_field: |         # Auto fields are editable (oddly), so need to check for auto or non-editable pk | ||||||
|  |         if self.form._meta.model._meta.has_auto_field or not self.form._meta.model._meta.pk.editable: | ||||||
|             return True |             return True | ||||||
|         # Also search any parents for an auto field. |         # Also search any parents for an auto field. (The pk info is propagated to child | ||||||
|  |         # models so that does not need to be checked in parents.) | ||||||
|         for parent in self.form._meta.model._meta.get_parent_list(): |         for parent in self.form._meta.model._meta.get_parent_list(): | ||||||
|             if parent._meta.has_auto_field: |             if parent._meta.has_auto_field: | ||||||
|                 return True |                 return True | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
|   {% for fieldset in inline_admin_form %} |   {% for fieldset in inline_admin_form %} | ||||||
|     {% include "admin/includes/fieldset.html" %} |     {% include "admin/includes/fieldset.html" %} | ||||||
|   {% endfor %} |   {% endfor %} | ||||||
|   {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} |   {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} | ||||||
|   {{ inline_admin_form.fk_field.field }} |   {{ inline_admin_form.fk_field.field }} | ||||||
| </div>{% endfor %} | </div>{% endfor %} | ||||||
| </div> | </div> | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ | |||||||
|           {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %} |           {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %} | ||||||
|           {% if inline_admin_form.show_url %}<a href="{% url 'admin:view_on_site' inline_admin_form.original_content_type_id inline_admin_form.original.pk %}">{% trans "View on site" %}</a>{% endif %} |           {% if inline_admin_form.show_url %}<a href="{% url 'admin:view_on_site' inline_admin_form.original_content_type_id inline_admin_form.original.pk %}">{% trans "View on site" %}</a>{% endif %} | ||||||
|             </p>{% endif %} |             </p>{% endif %} | ||||||
|           {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} |           {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} | ||||||
|           {{ inline_admin_form.fk_field.field }} |           {{ inline_admin_form.fk_field.field }} | ||||||
|           {% spaceless %} |           {% spaceless %} | ||||||
|           {% for fieldset in inline_admin_form %} |           {% for fieldset in inline_admin_form %} | ||||||
|   | |||||||
| @@ -12,8 +12,26 @@ class BookInline(admin.TabularInline): | |||||||
|     model = Author.books.through |     model = Author.books.through | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NonAutoPKBookTabularInline(admin.TabularInline): | ||||||
|  |     model = NonAutoPKBook | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NonAutoPKBookStackedInline(admin.StackedInline): | ||||||
|  |     model = NonAutoPKBook | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class EditablePKBookTabularInline(admin.TabularInline): | ||||||
|  |     model = EditablePKBook | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class EditablePKBookStackedInline(admin.StackedInline): | ||||||
|  |     model = EditablePKBook | ||||||
|  |  | ||||||
|  |  | ||||||
| class AuthorAdmin(admin.ModelAdmin): | class AuthorAdmin(admin.ModelAdmin): | ||||||
|     inlines = [BookInline] |     inlines = [BookInline, | ||||||
|  |         NonAutoPKBookTabularInline, NonAutoPKBookStackedInline, | ||||||
|  |         EditablePKBookTabularInline, EditablePKBookStackedInline] | ||||||
|  |  | ||||||
|  |  | ||||||
| class InnerInline(admin.StackedInline): | class InnerInline(admin.StackedInline): | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ Testing of admin inline formsets. | |||||||
|  |  | ||||||
| """ | """ | ||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
|  | import random | ||||||
|  |  | ||||||
| from django.db import models | from django.db import models | ||||||
| from django.contrib.contenttypes.models import ContentType | from django.contrib.contenttypes.models import ContentType | ||||||
| @@ -48,6 +49,25 @@ class Author(models.Model): | |||||||
|     books = models.ManyToManyField(Book) |     books = models.ManyToManyField(Book) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NonAutoPKBook(models.Model): | ||||||
|  |     rand_pk = models.IntegerField(primary_key=True, editable=False) | ||||||
|  |     author = models.ForeignKey(Author) | ||||||
|  |     title = models.CharField(max_length=50) | ||||||
|  |  | ||||||
|  |     def save(self, *args, **kwargs): | ||||||
|  |         while not self.rand_pk: | ||||||
|  |             test_pk = random.randint(1, 99999) | ||||||
|  |             if not NonAutoPKBook.objects.filter(rand_pk=test_pk).exists(): | ||||||
|  |                 self.rand_pk = test_pk | ||||||
|  |         super(NonAutoPKBook, self).save(*args, **kwargs) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class EditablePKBook(models.Model): | ||||||
|  |     manual_pk = models.IntegerField(primary_key=True) | ||||||
|  |     author = models.ForeignKey(Author) | ||||||
|  |     title = models.CharField(max_length=50) | ||||||
|  |  | ||||||
|  |  | ||||||
| class Holder(models.Model): | class Holder(models.Model): | ||||||
|     dummy = models.IntegerField() |     dummy = models.IntegerField() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -211,6 +211,24 @@ class TestInline(TestCase): | |||||||
|         self.assertContains(response, max_forms_input % 2) |         self.assertContains(response, max_forms_input % 2) | ||||||
|         self.assertContains(response, total_forms_hidden) |         self.assertContains(response, total_forms_hidden) | ||||||
|  |  | ||||||
|  |     def test_inline_nonauto_noneditable_pk(self): | ||||||
|  |         response = self.client.get('/admin/admin_inlines/author/add/') | ||||||
|  |         self.assertContains(response, | ||||||
|  |             '<input id="id_nonautopkbook_set-0-rand_pk" name="nonautopkbook_set-0-rand_pk" type="hidden" />', | ||||||
|  |              html=True) | ||||||
|  |         self.assertContains(response, | ||||||
|  |             '<input id="id_nonautopkbook_set-2-0-rand_pk" name="nonautopkbook_set-2-0-rand_pk" type="hidden" />', | ||||||
|  |              html=True) | ||||||
|  |  | ||||||
|  |     def test_inline_editable_pk(self): | ||||||
|  |         response = self.client.get('/admin/admin_inlines/author/add/') | ||||||
|  |         self.assertContains(response, | ||||||
|  |             '<input class="vIntegerField" id="id_editablepkbook_set-0-manual_pk" name="editablepkbook_set-0-manual_pk" type="text" />', | ||||||
|  |              html=True, count=1) | ||||||
|  |         self.assertContains(response, | ||||||
|  |             '<input class="vIntegerField" id="id_editablepkbook_set-2-0-manual_pk" name="editablepkbook_set-2-0-manual_pk" type="text" />', | ||||||
|  |              html=True, count=1) | ||||||
|  |  | ||||||
|  |  | ||||||
| @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) | @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) | ||||||
| class TestInlineMedia(TestCase): | class TestInlineMedia(TestCase): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user