0

我有一个 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']

和模型形式

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

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

4

2 回答 2

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))
于 2012-06-03T03:38:32.060 回答
0

Django 告诉您必须启动一个类别实例才能迭代类别。因此,类别实例从 url 中获取参数,在 urls.py 中使用正则表达式的 url 参数。因此,您需要捕获参数并使其成为视图中的类别实例。

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

于 2012-06-03T02:13:27.063 回答