【问题标题】:Inside Django class-base CreateView, how to init intermediate model在 Django 类基础 CreateView 内部,如何初始化中间模型
【发布时间】:2015-07-01 11:14:27
【问题描述】:

我有三个模型,PiItem 是 Pi 和 Items 模型“通过”的接口。

现在我想在 Django CreatedView 类中创建一个带有新 Pi 实例和新 PiItem 实例的新 Items 实例。

不知何故,我不断收到错误消息

*

*****MultipleObjectsReturned at /product/get() 返回了多个 PiItem*****

*

任何帮助将不胜感激 谢谢

这里是模型

class Pi(models.Model):
    company = models.ForeignKey(CompanyProfile, related_name='pi', null=True)
    contact = models.ForeignKey(Contact, null=True)

    def __unicode__(self):
        #return u'%s, %s' %(self.company.companyprofile_name, self.reference_id)
        return u'%s' %(self.company.companyprofile_name)



class Items(models.Model):
    product_id = models.CharField("Product ID",max_length=50, blank=False, null=True, unique=True)
    in_pi = models.ManyToManyField(Pi, through='PiItem', blank=True)

    def __unicode__(self):
        return self.product_id


class PiItem(models.Model):
    item_name= models.ForeignKey(Items)
    pi = models.ForeignKey(Pi)

    def __unicode__(self):
        return self.pi.reference_id

这是我的观点.py

from django.views.generic.edit import CreateView
from pi.models import Items, PiItem, Pi
from django.shortcuts import get_object_or_404

class AddItemView(CreateView):

    context_object_name = 'Product_list'
    model = Items
    template_name = "product.html"
    fields = "__all__"

    def get_initial(self):
        in_pi = get_object_or_404(PiItem)
        return {
            'in_pi':in_pi
        }

这是模板

{% extends 'base.html' %}


{% load crispy_forms_tags %}

{% block pi %}

<form action="" method="post">{% csrf_token %}
    {{ form|crispy }}
    {{ form.get_form_class() }}
    <input type="submit" value="Create" />
</form>

【问题讨论】:

  • 我的第一个意图是在没有分配任何 Pi 对象的情况下创建一个新的 Items 实例以及 PiItem 实例......经过谷歌研究和几次尝试后,事实证明,每当 PiItem实例已创建,必须有 Pi 和 Items 实例与之连接...

标签: django-views foreign-key-relationship django-class-based-views manytomanyfield


【解决方案1】:

问题很可能在这里:

in_pi = get_object_or_404(PiItem)

您需要通过向每个相关模型传递附加参数(例如 foreigk 键)来过滤 PiItem 对象,例如:

in_pi = get_object_or_404(PiItem, item_name=something1, pi=something2)

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 2020-02-06
    • 2010-11-10
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多