#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.

Reply via email to