2012-06-02 128 views
0

我有在UploadForm这一类的字段,它被认为是类实例的Django模型的Django的ModelForm ValueError异常

class Category(MPTTModel): 
    name = models.CharField(max_length=50, unique=True) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

    def __unicode__(self): 
     return self.name 
    class MPTTMeta: 
     order_insertion_by = ['name'] 

和的ModelForm

class UploadForm(ModelForm): 
    file = forms.FileField() 
    category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.filter(lft=F('rght')-1)) 
    class Meta: 
     model = UploadedFile 

不过,我有问题(如definied在模型中),但我的查询集返回列表的类别对象,我在模板中使用,以显示所有的叶子类别。如果我选​​择表单上的任何类别,并提交它,我得到这个错误(如果我选择cat5)'不能分配[ Category:cat5]:“UploadedFile.category”必须是“Category”实例。' 所以我明白为什么会出现这个错误,但我想使用ModelForm因为save()方法,但是看不到我如何解决这个问题。任何建议?

+0

这里是一个小更info.If我设置小部件= forms.SelectMultiple的类别我得到ValueError异常,但与小部件= forms.Select工程确定,但小部件是不是有什么我在找。 – Zed

回答

0

Django告诉你必须启动一个类别实例才能遍历类别。因此,类别实例从url中获取params,在您的urls.py中将url params与正则表达式一起使用。因此,您需要捕获该参数并将其作为视图中的类别实例。

*请参阅基于类的通用视图,其中视图会自动为您提供params上下文变量。

0

我觉得

category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.filter(lft=F('rght')-1)) 

工程的M2M关系,我猜类是在模型中上传的文件一个ForeignKey。如果是这样,你应该使用

category = mpttform.TreeNodeChoiceField(queryset=Category.objects.filter(lft=F('rght')-1)) 
+0

是的,它会工作,但会渲染该字段作为一个丑陋的选择部件,与TreeNodeMultipleChoiceField我得到正常的列表框和tha的是我想要的。当我设置widget = forms.SelectMultiple为TreeNodeChoiceField我再次得到同样的错误,因为它与TreeNodeMultipleChoiceFiel 。 – Zed