Code

Opened 7 years ago

Closed 19 months ago

Last modified 19 months ago

#4467 closed New feature (wontfix)

handle a huge list of ForeignKey objects by implementing a CategorizedModelChoiceField

Reported by: ulda Owned by: nobody
Component: Forms Version: master
Severity: Normal Keywords: ForeignKey ModelChoiceField
Cc: ulf.dambacher@… Triage Stage: Someday/Maybe
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

Think of having a model like this:

PRKAT_CHOICES= (
    ('M','Metrisch'),
    ('MF', 'Metrisch-Fein'),
#   some more here left out for shortness...
)
class Profil(models.Model):
    kategorie=models.CharField('Kategorie',maxlength=4,choices=PRKAT_CHOICES)
    bezeichnung=models.CharField('Bezeichnung',maxlength=30)

and your database fills up with profile objects in hundreds with different categories.

Now another model is calling this model like

class Karte(models.Model):
	ba_nr=models.PositiveIntegerField("BA-Nr",primary_key=True)
	datum=models.DateField("Datum",default=date.today)

	profil=ForeignKey(Profil)

and in your forms for Karte you get an ugly select filling the screen.

Attached you find a CategorizedModelChoiceField. With this in hand, you subclass ForeignKey to your model specific ProfileKey

class ProfilKey(models.ForeignKey):
    def formfield(self,**kwargs):
        defaults = {'form_class': CategorizedModelChoiceField, 'queryset': self.rel.to._default_manager.all(), 'category': 'kategorie' , 'callback_link': '/pr/list_of_profiles_for_category/'}
        defaults.update(kwargs)
        return super(ProfilKey, self).formfield(**defaults)

and change the ForeignKey definition in your other model to

	profil=ProfileKey(Profil)

Because the whole thing works with a simple kind of ajax, you need a callback function in your urls like this:

urlpatterns = patterns('myproject.categorizedmodelchoicefield',
    (r'^pr/list_of_profiles_for_category/$','get_choices_for_category',
     { 'queryset': Profil.objects.all(),
       'category_name':'kategorie' } ),
)

and voilais: in your forms for Karte you get two selects for category and the actual choice value which updates according to the users selection.

you may also use the formfield_callback but why not using the objects if they are handy...

making it work you need:

  • CategorizedModelChoiceField.py attached
  • JsonResponse from djangosnipplets.org
  • http.Request form openjsan.org loaded somewhere in your base templates

I think something like this should be included as example extension to newforms and to using django/json/ajax. therefore i didn't post ant djangosnipplets.

the javascript code maybe looks ugly, but this is because it was the first time i did javascript.

Attachments (1)

categorizedmodelchoicefield.py (4.8 KB) - added by ulda <ulf.dambacher@…> 7 years ago.

Download all attachments as: .zip

Change History (7)

Changed 7 years ago by ulda <ulf.dambacher@…>

comment:1 Changed 7 years ago by ubernostrum

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement set

The JS in this patch seems to require some third-party toolkit to work properly; tying Django to a JavaScript library is not something we're interested in doing.

comment:2 Changed 6 years ago by jacob

  • Triage Stage changed from Unreviewed to Someday/Maybe

comment:3 Changed 3 years ago by gabrielhurley

  • Severity set to Normal
  • Type set to New feature

comment:4 Changed 2 years ago by aaugustin

  • UI/UX unset

Change UI/UX from NULL to False.

comment:5 Changed 2 years ago by aaugustin

  • Easy pickings unset

Change Easy pickings from NULL to False.

comment:6 Changed 19 months ago by aaugustin

  • Resolution set to wontfix
  • Status changed from new to closed

The implementation is very far from Django's current standards, and it doesn't need to live in core.

Besides, demand for this feature is non-existent: there hasn't been a single commend here in 6 years.

Version 0, edited 19 months ago by aaugustin (next)

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.