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, | ||||
|                 self.readonly_fields, model_admin=self.model_admin, **options) | ||||
|  | ||||
|     def has_auto_field(self): | ||||
|         if self.form._meta.model._meta.has_auto_field: | ||||
|     def needs_explicit_pk_field(self): | ||||
|         # 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 | ||||
|         # 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(): | ||||
|             if parent._meta.has_auto_field: | ||||
|                 return True | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
|   {% for fieldset in inline_admin_form %} | ||||
|     {% include "admin/includes/fieldset.html" %} | ||||
|   {% 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 }} | ||||
| </div>{% endfor %} | ||||
| </div> | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
|           {% 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 %} | ||||
|             </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 }} | ||||
|           {% spaceless %} | ||||
|           {% for fieldset in inline_admin_form %} | ||||
|   | ||||
| @@ -12,8 +12,26 @@ class BookInline(admin.TabularInline): | ||||
|     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): | ||||
|     inlines = [BookInline] | ||||
|     inlines = [BookInline, | ||||
|         NonAutoPKBookTabularInline, NonAutoPKBookStackedInline, | ||||
|         EditablePKBookTabularInline, EditablePKBookStackedInline] | ||||
|  | ||||
|  | ||||
| class InnerInline(admin.StackedInline): | ||||
|   | ||||
| @@ -3,6 +3,7 @@ Testing of admin inline formsets. | ||||
|  | ||||
| """ | ||||
| from __future__ import unicode_literals | ||||
| import random | ||||
|  | ||||
| from django.db import models | ||||
| from django.contrib.contenttypes.models import ContentType | ||||
| @@ -48,6 +49,25 @@ class Author(models.Model): | ||||
|     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): | ||||
|     dummy = models.IntegerField() | ||||
|  | ||||
|   | ||||
| @@ -211,6 +211,24 @@ class TestInline(TestCase): | ||||
|         self.assertContains(response, max_forms_input % 2) | ||||
|         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',)) | ||||
| class TestInlineMedia(TestCase): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user