2014-10-27 53 views
2

我有返回提交本聲明的訂單:無法分配必須是一個實例的Django

Cannot assign "<Annual: 2012>": "Order.annuals" must be a "Catalog" instance. 

我是相當新的Django的。我知道它需要一個實例,而不是已經傳遞的字符串。我將如何去解決這個問題?

這是我的觀點:

class OrderListCreateView(
    views.LoginRequiredMixin, 
    views.SetHeadlineMixin, 
    generic.CreateView 
    ): 
    form_class = forms.OrderListForm 
    headline = 'Create' 
    model = Order 
    template_name = 'ordercreate.html' 


    def form_valid(self, form): 
    self.object = form.save(commit=False) 
    self.object.user = self.request.user 
    self.object.save() 
    return super(OrderListCreateView, self).form_valid(form) 

這裏是我的形式:

class OrderListForm(forms.ModelForm): 

annuals = forms.ModelChoiceField(queryset=Annual.objects.all()) 
issues = forms.ModelChoiceField(queryset=Issue.objects.all()) 
articles = forms.ModelChoiceField(queryset=Article.objects.all()) 

class Meta: 
    fields = (
       'annuals', 
       'issues', 
       'articles',) 
    model = models.Order 

def __init__(self, *args, **kwargs): 
    super(OrderListForm, self).__init__(*args, **kwargs) 
    self.helper = FormHelper() 
    self.helper.layout = Layout(
       'annuals', 
       'issues', 
       'articles', 
     ButtonHolder(
      Submit('create', 'Create') 

     ) 

    ) 

這裏是我的模型:

class Catalog(models.Model): 
    products = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.products 


class Issue(models.Model): 
    catalog = models.ForeignKey(Catalog, related_name='issue_products') 
    Volume = models.DecimalField(max_digits=3, decimal_places=1) 

    def __unicode__(self): 
     return unicode(self.Volume) 


class Annual(models.Model): 
    catalog = models.ForeignKey(Catalog, related_name='annual_products') 
    year_id = models.IntegerField(max_length=4) 
    start_date = models.CharField(max_length=6) 
    end_date = models.CharField(max_length=6) 
    def __unicode__(self): 
     return unicode(self.year_id) 

    #def __unicode__(self): 
    # return unicode(self.id) 

class Annual_Issue(models.Model): 
    annual_id = models.ForeignKey(Annual, related_name='annual_ids') 
    issue_id = models.ForeignKey(Issue, related_name='issues') 
    def __unicode__(self): 
     return self.annual_id 


class Article(models.Model): 
    catalog = models.ForeignKey(Catalog, related_name='article_products') 
    title = models.CharField(max_length=200) 
    abstract = models.TextField(max_length=1000, blank=True) 
    full_text = models.TextField(blank=True) 
    proquest_link = models.CharField(max_length=200, blank=True, null=True) 
    ebsco_link = models.CharField(max_length=200, blank=True, null=True) 

    def __unicode__(self): 
     return self.title 


class Order(models.Model): 
    user = models.ForeignKey(User, related_name='who_ordered') 
    annuals = models.ForeignKey(Catalog, related_name='annuals_ordered', blank=True, null=True) 
    issues = models.ForeignKey(Catalog, related_name='issues_ordered', blank=True, null=True) 
    articles = models.ForeignKey(Catalog, related_name='items_ordered', blank=True, null=True) 

回答

4

您的訂單模式,您已經定義了一個ForeignKey關係爲其他幾個模型(年度,問題和文章),但每個關係指向目錄模型。當您嘗試保存由表單創建的Order實例時,它已收到這些類型的對象(Annual,Issue和Article),但它不能在Order模型中定義的字段中存儲對這些對象的外鍵引用。這是由於訂單上的外鍵字段要求它們只能包含對目錄對象的引用。

如果對於這些外鍵關係中的每一個,希望存儲這些不同種類的對象之一,則需要更改Order模型定義以期望引用這些模型的對象而不是Catalog對象。

簡而言之,我建議修改Order模型以包含以下關係。這將允許訂單對象存儲對每個其他類型(年度,問題和文章)的對象的單一引用。

annuals = models.ForeignKey(Annual, related_name='annuals_ordered', blank=True, null=True) 
issues = models.ForeignKey(Issue, related_name='issues_ordered', blank=True, null=True) 
articles = models.ForeignKey(Article, related_name='items_ordered', blank=True, null=True) 

有關在Django,see the reference here ForeignKey的關係的更多信息。

+1

謝謝!這就說得通了。 – byrdr 2014-10-27 03:30:45

相關問題