Creating a dynamic choice field django choices 动态 lazy

a. 第一种方法(admin保存出错)

 

I'm having some trouble trying to understand how to create a dynamic choice field in django. I have a model set up something like:

 

class rider(models.Model):
     user = models.ForeignKey(User)
     waypoint = models.ManyToManyField(Waypoint)

class Waypoint(models.Model):
     lat = models.FloatField()
     lng = models.FloatField()

What I'm trying to do is create a choice Field whos values are the waypoints associated with that rider (which would be the person logged in).

Currently I'm overriding init in my forms like so:

class waypointForm(forms.Form):
     def __init__(self, *args, **kwargs):
          super(joinTripForm, self).__init__(*args, **kwargs)
          self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.all()])

 

a. 第二种方法(妥妥的)

I use lazy for lazy load:

from django.utils.functional import lazy

def help_SHOP_CHOICES():
    SHOP1_CHOICES = (
        ('Food Court', 'Food Court'),
        ('KFC', 'KFC'),
      ]
    SHOP3_CHOICES = [
        ('Bowling Arena', 'Bowling Arena'),
        ('Cinemax', 'Cinemax'),
      ]
    return choice( SHOP1_CHOICES, SHOP3_CHOICES )  #choice one

class Feed(models.Model):
  ...
  location=models.CharField(max_length=25, choices=SHOP1_CHOICES)

  def __init__(self, *args, **kwargs):
     super(Feed, self).__init__(*args, **kwargs)
     self._meta.get_field_by_name('location')[0]._choices = \
                        lazy(help_SHOP_CHOICES,list)()

测试通过

 

 

c.最简单的方法(妥妥的)

 

 

from django.utils.functional import lazy

def help_SHOP_CHOICES():
    SHOP1_CHOICES = (
        ('Food Court', 'Food Court'),
        ('KFC', 'KFC'),
      )
    SHOP3_CHOICES = (
        ('Bowling Arena', 'Bowling Arena'),
        ('Cinemax', 'Cinemax'),
      )
    return choice( SHOP1_CHOICES, SHOP3_CHOICES )  #choice one

class Feed(models.Model):
  ...
  location=models.CharField(max_length=25, choices=lazy(help_SHOP_CHOICES,tuple)()) #这里类型一定要对,list和tuple要分清楚

 

注意,如果help_shop_choices是从数据库里取的话,一定要加try,否则初始化django会读不到表

def help_SHOP_CHOICES():
    try:
        choices = get_db() #从数据库里取
    except Exception, e:
        return ((None,None),)

 

end


分享到: 微信 更多