Django

Code

Ticket #2445: choices_func.2.diff

File choices_func.2.diff, 2.1 kB (added by Dmitri Fedortchenko <zeraien@gmail.com>, 8 months ago)

Accidentally included some debug print statements in the previous patch...whoops

  • django/db/models/base.py

    old new  
    163163                val = field.get_default() 
    164164            setattr(self, field.attname, val) 
    165165 
     166        for item in dir(self): 
     167            if item.startswith('choices_for__'): 
     168                choice_func = getattr(self,item) 
     169                if callable(choice_func): 
     170                    field_name = choice_func.__name__[len('choices_for__'):] 
     171                    self._meta.get_field(field_name)._choices = choice_func 
     172         
    166173        if kwargs: 
    167174            for prop in kwargs.keys(): 
    168175                try: 
  • django/db/models/fields/__init__.py

    old new  
    88 
    99from django.db import get_creation_module 
    1010from django.db.models import signals 
     11import django.db.models.query 
    1112from django.dispatch import dispatcher 
    1213from django.conf import settings 
    1314from django.core import validators 
     
    340341        "Returns a list of tuples used as SelectField choices for this field." 
    341342        first_choice = include_blank and blank_choice or [] 
    342343        if self.choices: 
    343             return first_choice + list(self.choices) 
     344            if callable(self.choices): 
     345                choices = self.choices() 
     346            else: 
     347                choices = self.choices 
     348            # If choices is a QuerySet, convert into a tuple list ((pk,__unicode__),etc) 
     349            if isinstance(choices, django.db.models.query.QuerySet): 
     350                choices = [(x._get_pk_val(), smart_unicode(x)) for x in choices] 
     351            return first_choice + list(choices) 
     352             
    344353        rel_model = self.rel.to 
    345354        if hasattr(self.rel, 'get_related_field'): 
    346355            lst = [(getattr(x, self.rel.get_related_field().attname), smart_unicode(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]