#7028: Better raw_id_fields feedback in newform-admins branch
-------------------------------------+-------------------------------------
Reporter: Marcob | Owner: nobody
<marcoberi@…> | Status: new
Type: New feature | Version: master
Component: contrib.admin | Resolution:
Severity: Normal | Triage Stage: Accepted
Keywords: raw-id-fields nfa- | Needs documentation: 0
someday design_ux | Patch needs improvement: 1
Has patch: 1 | UI/UX: 1
Needs tests: 1 |
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Comment (by stanislas.guerra@…):
But this does not works with inlines. Using {{{token_fields}}} into an
{{{InlineModelAdmin}}} gives 404 in ajax call to render the FK unicode().
For example, I have added in the test the following models:
{{{
class TicketDealer(models.Model):
name = models.CharField(blank=False, max_length=20)
website = models.URLField(blank=True)
def __unicode__(self):
return self.name
class TokenFieldTicketDealerEvent(models.Model):
"""
A model that has token fields in the admin inline.
"""
dealer = models.ForeignKey(TicketDealer)
event = models.ForeignKey(TokenFieldEvent)
}}}
And the admin:
{{{
class TokenFieldTicketDealerEventAdminInline(admin.StackedInline):
model = models.TokenFieldTicketDealerEvent
token_fields = ('dealer',)
class TokenFieldEventAdmin(admin.ModelAdmin):
token_fields = ['main_band', 'supporting_bands']
inlines = (TokenFieldTicketDealerEventAdminInline,)
}}}
With the TestCase:
{{{
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
class
AdminInlineTokenWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
available_apps = ['admin_widgets'] +
AdminSeleniumWebDriverTestCase.available_apps
fixtures = ['admin-widgets-users.xml']
urls = "admin_widgets.urls"
webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
def setUp(self):
band = models.Band.objects.create(id=42, name='Bogey Blues')
event = models.TokenFieldEvent.objects.create(id=11,
main_band=band)
dealer1 = models.TicketDealer.objects.create(id=12, name="Cheap
Horse", website="www.ch.com")
dealer2 = models.TicketDealer.objects.create(id=21, name="Decent
Buy", website="www.db.com")
models.TokenFieldTicketDealerEvent.objects.create(event=event,
dealer=dealer1)
super(AdminInlineTokenWidgetSeleniumFirefoxTests, self).setUp()
def test_foreignkey(self):
self.admin_login(username='super', password='secret',
login_url='/')
self.selenium.get(
'%s%s' % (self.live_server_url,
'/admin_widgets/tokenfieldevent/11/'))
main_window = self.selenium.current_window_handle
}}}
It fires ''http://localhost:8081/admin_widgets/tokenfieldevent/objects-by-
ids/tokenfieldticketdealerevent_set-0-dealer/12/'' -> 404
I though it was just a bug in retrieving the field name into
RelatedObjectLookups.js#updateTokenField() and had it patched like that:
{{{
diff --git
a/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js
b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js
index 5d8a19c..b333cfd 100644
--- a/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js
+++ b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js
@@ -108,7 +108,7 @@ var updateTokenField = function(field) {
var $field = $(field);
$field.hide();
var container = $field.closest('div');
- var field_name = $field.attr('name');
+ var field_name = getTokenFieldName(field);
var pks = encodeURI($field.val());
if (pks) {
var objects_url = '../objects-by-ids/' + field_name + '/' + pks +
'/'; // FIXME: hard-coded url
@@ -128,6 +128,18 @@ var updateTokenField = function(field) {
}
};
+var getTokenFieldName = function(field) {
+ // inline fields are prefixed.
+ var $ = django.jQuery;
+ var $field = $(field);
+ var rx_prefix = new RegExp("\\\w+-\\\d{1,2}-\(\\\w+\)");
+ var field_name = $field.attr('name');
+ if (field_name.match(rx_prefix)) {
+ field_name = field_name.match(rx_prefix)[1];
+ }
+ return field_name;
+}
+
var removeToken = function(removeLink, field) {
var $ = django.jQuery;
var li = $(removeLink).parent();
}}}
Now It fires an Ajax call to
''http://localhost:8081/admin_widgets/tokenfieldevent/objects-by-
ids/dealer/12/'' -> 404, ''dealer'' not in
''TokenFieldEventAdmin.token_fields''.
This is because in RelatedOjectLookup.js (l.158) the ajax call is on
''../objects-by-ids/et/caetera/'' which is in the "path" of the parent
ModelAdmin.
In fact, there is not any url to call at this point because
{{{InlineModelAdmin}}} can't register any url.
Any idea on the direction to take ? allow InlineModelAdmin to register url
? Where (under its ModelAdmin or not) ?
Thanks.
--
Ticket URL: <https://code.djangoproject.com/ticket/7028#comment:78>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/086.826c1f0fbfc331afd24abae4fc661734%40djangoproject.com.
For more options, visit https://groups.google.com/groups/opt_out.