2012-06-02 90 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