Django ModelForm ValueError

时间:2012-06-02 17:46:03

标签: django django-mptt mptt

我有一个Django模型

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

但是,我在UploadForm中的这个类别字段有问题,它应该是Category实例(在Model中定义),但我的queryset返回我在模板中用来显示所有叶子类别的Category对象列表。如果我在表单上选择任何类别并提交它,我收到此错误(如果我选择cat5)'无法分配[类别:cat5]:“UploadedFile.category”必须是“类别”实例。 所以我理解为什么会发生这种错误,但我想使用ModelForm因为save()方法,但是我不知道如何解决这个问题。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

Django告诉您必须启动一个类别实例才能迭代这些类别。所以类别实例从你的urls.py中的url,url params和regex中获取params。因此,您需要捕获参数并将其作为视图中的类别实例。

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

答案 1 :(得分:0)

我认为

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

适用于m2m关系,我猜类别是模型Uploaded File中的ForeignKey。如果是这样,你应该使用

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