2011-04-18 72 views
2

我在Django中有两种内联表单的表单。其中之一是让我悲伤。 我的模型是这样的。Django使用optgroup选择选项无法验证

class BookingActivity(models.Model): 
    booking = models.ForeignKey('Booking') 
    program = models.ForeignKey(Program) 
    activity = models.ForeignKey(Activity, choices=programs_as_optgroups()) 

activity ForeignKey的选择是通过这种方法产生的:

def programs_as_optgroups(): 
    activities = [] 
    programs = [] 
    for program in Program.objects.all(): 
     new_program = [] 
     new_activities = [] 
     for activity in Activity.objects.filter(program=program): 
      new_activities.append([activity.id, activity.name]) 

     new_program = [program.name, new_activities] 
     activities.append(new_program) 

    return activities 

我想<optgroup>标签添加到我的ForeignKey选择这是工作。但是当我提交表格时,我收到一个错误:Cannot assign "u'3'": "BookingActivity.activity" must be a "Activity" instance.

这有些道理 - 有点。但是,如果我检查从表单发送的数据request。随着选择在建立或不我得到相同的值,即

activity = models.ForeignKey(Activity, choices=programs_as_optgroups())

activity = models.ForeignKey(Activity)

无论从形式返回一个u'3'。但我不明白为什么只有在使用optgroup时才会出现错误。

回答

2

我猜你在博客

sub_categories.append([sub_category.id, sub_category.name]) 

你有

new_activities.append([activity.id, activity]) 

我想你假设你会得到一个试图

http://dealingit.wordpress.com/2009/10/26/django-tip-showing-optgroup-in-a-modelform/

对象,当它实际上是一个字符串,你回来了。

+0

你猜对了。虽然你正在阅读的内容仍然是正确的,因为'活力'只会是通过__unicode__方法在选择选项中的标题。我会尽快更新我的代码。 – sdk900 2011-04-18 02:52:57

+0

@ sdk900也许你应该把它放在你的init方法后超级...对我来说这看起来很重要。 – 2011-04-18 03:01:51

+0

是的,这是问题,但因为我愚蠢地把我的'__init__'方法放在我的'Meta'类之前,我假设它是因为它具有表单的'model',正在覆盖更新的字段。虽然我曾尝试在modelForm中改变字段,像这样的'activity = forms.ChoiceField(choices = programs_as_optgroups())',它给了我与上面相同的错误。 – sdk900 2011-04-18 03:43:11