2012-06-02 3 views
0

У меня есть 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 

Однако, у меня проблема с этой категорией полем в UploadForm который должен быть экземпляром Категории (как определяемом в Model), но мой список возврата запроса для объектов категории, которые я использую в шаблоне, чтобы показать все категории листьев. Если я выберу любую категорию в форме и отправлю ее, я получу эту ошибку (в случае, если я выберу cat5) «Невозможно назначить [ Категория: cat5]: «UploadedFile.category» должен быть экземпляром «Категория». Так что я понимаю, почему эта ошибка происходит, но я бы хотел использовать ModelForm из-за метода save(), но не вижу, как я могу исправить это. Все предложения?

+0

Вот немного больше info.If Я установил виджет = forms.SelectMultiple для категории я получаю ValueError, но с виджетом = forms.Select работает нормально, но этот виджет не то, что Я ищу. – Zed

ответ

0

Django сообщает вам, что вы должны инициировать экземпляр категории, чтобы перебирать категории. Таким образом, экземпляр категории принимает параметры из url, url params с регулярным выражением в urls.py. Поэтому вам нужно захватить параметр и сделать его экземпляром категории в представлении.

* См. Общие представления, основанные на классе, для которых представления автоматически предоставляют вам переменную контекста 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. Я получаю нормальный список и та, что я хочу. Когда я устанавливаю widget = forms.SelectMultiple для TreeNodeChoiceField, я снова получаю ту же ошибку, что и в TreeNodeMultipleChoiceFiel , – Zed

Смежные вопросы