Hey guys,

Yes, I must say, in any advanced form there are fields that depends
one from another.
Country/Region/City, Project/Issue, Project/Owner, User/Account,
Group/User... when two selects appear, there's not zero probability
they will depend on each other. Also often a checkbox can
enable/disable select box, and so on.

Without javascript... these forms actually suck.
Not that I encouraging you to drop non-js forms support.

I just want to tell that fields data dependencies and field enable
dependencies are must-haves for usable, competitive and visually
appealing admin.

On Tue, May 26, 2009 at 10:10 AM, Margie <margierogin...@gmail.com> wrote:
>
> Yes, I use that.  Inside my formfield_for_foreignkey() method I
> instantiate my special widget.  My widget contains a render() method
> that generates javascript that makes an ajax request that requests the
> options for the select.  There is no way to prune down the selections
> with formfield_for_foreignkey(), in such a way that the selections are
> different for different objects.
>
> For example, for my Task object, I have
>
> class TaskAdmin(admin.ModelAdmin:
>
>    def formfield_for_foreignkey(self, db_field, request, **kwargs):
>        if db_field.name == "owner":
>            kwargs["widget"] = OwnerSelectWidget(db_field.rel)
>            return db_field.formfield(**kwargs)
>        return super(TaskAdmin, self).formfield_for_foreignkey
> (db_field, request, **kwargs)
>
> However, in the changelist view, different tasks have different sets
> of potential owners.  IE, a task that is for the foo project can have
> bob, joe, or mark as an owner.  But a task that is for the bar project
> can have jane, mary, or ann as an owner.  There is no way to implement
> this with just formfield_for_foreignkey(), because that method is for
> *all* Task objects and is executed at a point in the django source
> where there is no knowledge of what particular task is being
> rendered.  What I am trying to do is make it so that when the user
> clicks on the owner field for the foo task, they have the choice of
> bob, joe, or mark, and when they clock on the owner field for the bar
> task, they have the choice of jane, mary, or ann.  The Task has a
> resources field, and that identifies the possible resources (which can
> be the owner) for the task.  So when the user clicks on the owner
> field, the ajax request gets the resources for the particular task and
> fills the drop down selections with them.
>
> I have pasted a copy of my OwnerSelectWidget, as well as the above
> code at http://dpaste.com/47694/.  Maybe that will make it more
> clear.
>
> I don't know - maybe my needs are unusual.  It's definitely not your
> standard blog app ... so if I am too much on the outskirts for this to
> be something that we consider in the development community, I can
> understand that.  But it seems to me that having a dynamic (ie, object
> based) way to pair down options in a drop down would be something that
> would be useful to others.    And while I have a solution here, it was
> pretty tough  to get to and required a lot of studying and stepping
> through the source code.
>
> Anyway, hope the problem I am trying to solve and the solution I have
> posted are understandable.  Would love to hear from those in the
> development community as to whether you think this is a wortwhile
> addition.

>
> Margie
>
> On May 25, 7:29 pm, Justin Lilly <justinli...@gmail.com> wrote:
>> Not entirely sure if this is what you were referring to, Margie, but
>> you can limit a the queryset used for an admin dropdown (FK).  Code
>> for this looks something like:
>>
>>     # defined in the ModelAdmin for this class.
>>     def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
>>         field = super(HomepageAdmin,
>> self).formfield_for_foreignkey(db_field, request=None, **kwargs)
>>         if db_field.name == 'promo_story':
>>             field.queryset =
>> Article.objects.filter(id__in=Article.objects.all()[:100])
>>         return field
>>
>> Also, if you want this specifically in relation to an FK autocomplete,
>> you should be able to implement that in the view that returns your
>> results.
>>
>>  -justin
>>
>>
>>
>> On Mon, May 25, 2009 at 9:26 PM, Margie <margierogin...@gmail.com> wrote:
>>
>> > I think that foreign key selection in the admin interface is a great
>> > area to be putting cycles into.  I've played around with Jannis
>> > Leidel's foreign key autocomlete widget and am familiar with that, I
>> > think you are modeling your stuff after that, is that right?  While I
>> > think that is a cool widget, I find that the real problem with foreign
>> > key selection in the admin is that there is no easy way to prune down
>> > the set of choices.  If one has a lot of choices, autocomplete is not
>> > really a help, especially if you don't know the choice names.  For
>> > example, in the app I am developing (a task management system), I have
>> > tasks and owners of tasks.  The owner of the task can be user in the
>> > system, and there are 6000+ users.
>>
>> > What I would really like to see is foreign key selection widget where,
>> > when the end-user clicks on the foreign key selection dropdown, it
>> > sends an ajax request back to the server to execute a app-developer-
>> > specified method that returns a queryset, and the results of this
>> > queryset would then get placed into the select options for the foreign
>> > key selection drop down.
>>
>> > I have proof-of-concept code that I have implemented and would be
>> > happy to provide the code I have.  While developing this code, I
>> > wrestled extensively with a couple problems.  One is described in a
>> > bug I posted on Friday:http://code.djangoproject.com/ticket/11183.
>> > The render function for my widget initially renders just a single
>> > choice for the selections - the choice that is the currently selected
>> > owner.  The reason I override the default queryset from inside render
>> > () is that the default queryset in my case would the 6000+ users.  It
>> > seemed silly to send 6000+ selection options when they would get
>> > replaced on the user's click.  Keep in mind this widget also gets used
>> > in the changelist view, so the 6000 option selections would be sent
>> > for each object in the changelist view (and there can be many).
>> > Anyway, when overriding the selection in render(), I encountered
>> > problems in the core django datastructurse that made this not work -
>> > this is the bub described in 11183.
>>
>> > The second problem I wrestled with  was how to pass the id of the
>> > currently displayed object to the my get_owner_queryset() callback
>> > method.  IE, from the changelist view, when the user tries to change
>> > the owner of task 'n',  how to get my new widget's jquery/javascript
>> > to send 'n' as an argument to the callback method.  I did manage to do
>> > this in javascript by finding the id of my owner field (ie, id_form-3-
>> > owner) and replacing "owner" with "id", and then sending the value of
>> > that field.  This of course depends on there being a field that is
>> > id_form-3-id whose value is the id of the object being displayed.  I
>> > would like to find a better way to do this, but I don't know if there
>> > is one.
>>
>> > Anyway, perhaps some will say that I am trying to use the admin
>> > interface for more than it was intended for.  But I have been
>> > impressed with how much  the admin can do for me, and I would really
>> > like to use it because as it gets extended, I feel I can really
>> > benefit from those extensions.  However, I find the inability to give
>> > the user a viable way to choose foreign keys to be a real show
>> > stopper.  In the same vein, I think that there should be a way to
>> > configure the behavior of the little green '+', (showAddAnother
>> > popup).  To use my task/owner example again - when the user is
>> > choosing a task owner,  I wouldn't ever want the user to be able to
>> > add another user.  I want them to be able to choose different owners
>> > without being able to add new users.
>>
>> > Of course I can do all of this myself - and I have been working
>> > (slowly) towards that end. But as a relatively experienced user, my .
>> > 02 regarding the admin interface and foreign keys is that it would be
>> > a huge benefit to:
>> >  1) provide an interface that allows the app-developer to prune down
>> > the choices for a foreign key via an ajax callback to an app-developer
>> > specified method.
>> >  2) give the app-developer more control of the showAddAnotherPopup.
>>
>> > Is this the right place for this discussion?  If not, what is?
>>
>> > Margie
>>
>> > On May 25, 3:11 am, Zain Memon <z...@inzain.net> wrote:
>> >> Since GSoC officially started a couple of days ago, I've implemented a 
>> >> rough
>> >> draft of an autocomplete widget for foreign keys in the admin.
>>
>> >> You can see a screenshot and a short write-up of the functionality on my
>> >> blog 
>> >> here:http://inzain.net/blog/2009/05/a-foreign-key-autocomplete-widget-for-...
>>
>> >> Also, I've set up a GitHub repo for my work until official svn branches 
>> >> are
>> >> handed out. You can follow my progress 
>> >> here:http://github.com/zain/django/tree/master
>>
>> >> Zain

-- 
Best regards, Yuri V. Baburov, ICQ# 99934676, Skype: yuri.baburov,
MSN: bu...@live.com

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to