无法分配必须是Django实例

时间:2014-10-27 02:09:10

标签: django django-models django-forms

我有一个订单表格,它返回此提交声明:

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)

1 个答案:

答案 0 :(得分:4)

在Order模型中,您已为其他几个模型(年度,问题和文章)定义了ForeignKey关系,但这些关系中的每一个都指向Catalog模型。当您尝试保存表单创建的Order实例时,它已收到这些类型的对象(年度,问题和文章),但它不能在Order模型上定义的字段中存储对这些对象的外键引用。这是由于订单上的外键字段要求它们只能包含对Catalog对象的引用。

如果对于这些外键关系中的每一个,您希望存储这些不同类型的对象之一,则需要更改Order模型定义以期望引用这些模型的对象而不是Catalog对象。

简而言之,我建议修改订单模型以包含以下关系。这将允许订单对象存储对彼此类型的对象(年度,问题和文章)的单个引用。

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中的ForeignKey关系的更多信息,请see the reference here

相关问题