2014-10-27 6 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 отношения для нескольких других моделей (Annual, Issue и Article), но каждое из этих отношений указывает на модель Каталога. Когда вы пытаетесь сохранить экземпляр Order, созданный вашей формой, он получил объекты этих типов (Annual, Issue и Article), но не может хранить ссылку на внешние ключи для этих объектов в полях, определенных в модели 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) 

Для получения дополнительной информации о ForeignKey отношений в Django, see the reference here.

+1

Спасибо! В этом есть смысл. – byrdr

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