Fixed #13696 -- ensured inline pk field is rendered
This commit is contained in:
parent
415a36947c
commit
3aad955ea8
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue