Skip to content

Commit

Permalink
Fixed django#13696 -- ensured inline pk field is rendered
Browse files Browse the repository at this point in the history
  • Loading branch information
kmtracey committed Jul 19, 2013
1 parent 6d52844 commit 9e5519f
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 5 deletions.
4 changes: 2 additions & 2 deletions django/contrib/admin/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,8 @@ def __iter__(self):
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):
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.
for parent in self.form._meta.model._meta.get_parent_list():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ <h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;<span class=
{% 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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{% 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 %}
Expand Down
20 changes: 19 additions & 1 deletion tests/admin_inlines/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
20 changes: 20 additions & 0 deletions tests/admin_inlines/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""
from __future__ import unicode_literals
import random

from django.db import models
from django.contrib.contenttypes.models import ContentType
Expand Down Expand Up @@ -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()

Expand Down
18 changes: 18 additions & 0 deletions tests/admin_inlines/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,24 @@ def test_custom_get_extra_form(self):
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):
Expand Down

1 comment on commit 9e5519f

@DarussalamTech
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previous
class UserProfileInline(admin.StackedInline):
""" As you are noticed your profile will be edited as inline form """
model = model.UserProfile
Now
class UserProfileInline(admin.StackedInline):
""" As you are noticed your profile will be edited as inline form """
model = UserProfile

working

my child model is

Please sign in to comment.