#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: | dev |
| 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)
Change History (7)
by , 18 years ago
| Attachment: | categorizedmodelchoicefield.py added |
|---|
comment:1 by , 18 years ago
| Patch needs improvement: | set |
|---|
comment:2 by , 18 years ago
| Triage Stage: | Unreviewed → Someday/Maybe |
|---|
comment:3 by , 15 years ago
| Severity: | → Normal |
|---|---|
| Type: | → New feature |
comment:6 by , 13 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | new → 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 comment here in 6 years.
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.