Django - 获取相关密钥并插入数据库

时间:2016-12-28 20:01:26

标签: python django models foreign-key-relationship

好的,我试图做的是允许用户添加"产品"他们的商店,但无需选择商店添加,因为每个用户只有一个商店。

我得到了: " IntegrityError at / shop / product / add / NOT NULL约束失败:shop_product.business_id"

这是在局部变量中显示的内容: Local Vars

本地Vars:

Variable    Value
__class__   <class 'shop.views.ProductCreate'>
form    <AddProductForm bound=True, valid=True, fields=(product_name;product_desc;product_image)>
s    <Shop: 4>
self     <shop.views.ProductCreate object at 0x048B0370>
user     10

现在我相信这个问题可能是&#34; s&#34;变量,因为代码实际上正在获得正确的商店..但它也添加了奇怪的&#34;

我的代码就像现在一样。

models.py

 # Shop Model. A Shop Object will be created when the user registers
class Shop(models.Model):
    name = models.CharField(max_length=150)
    owner = models.OneToOneField(User, related_name="owner")
    shop_logo = models.FileField()

    def __str__(self):
        return str(self.name) + ": " + str(self.owner)

    def create_shop(sender, **kwargs):
        user = kwargs["instance"]
        if kwargs["created"]:
            up = Shop(owner=user)
            up.save()
    post_save.connect(create_shop, sender=User)

    def shoplogo_or_default(self, default_path='/static/images/dft/no-img.png'):
        if self.shop_logo:
            return self.shop_logo
        return default_path


    # The class that will link a product to the shop
class Product(models.Model):
            product_name = models.CharField(max_length=250)
            # connect the product to the shop
            business = models.ForeignKey(Shop, on_delete=models.CASCADE, related_name="products")
            product_desc = models.TextField()
            product_image = models.FileField()

            def __str__(self):
                return self.product_name

views.py

class ProductCreate(CreateView):
    model = Product
    form_class = AddProductForm
    template_name = 'shop/add-product.html'

        def form_valid(self, form):
        form.save(commit=False)
        # get current logged in user
        user = self.request.user.id
        # match the current logged in user to an owner in the Shop model
        s = Shop.objects.get(owner=user)
        #  get the id of that owner's shop identification number
        form.business = str(s.id)
        form.save()
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super(ProductCreate, self).form_valid(form)

以上理论上应该获取当前登录用户,将该用户与店铺模型中的商店作为所有者进行匹配,然后获取该商店ID。

forms.py

class AddProductForm(forms.ModelForm):
class Meta:
    model = Product
    fields = ['product_name', 'product_desc', 'product_image']
    exclude = ['business']

我对Django和学生都很陌生,所以如果你看到任何奇怪的话,我想道歉。

谢谢:)

1 个答案:

答案 0 :(得分:3)

您已关闭,但请勿尝试将商店值编辑到表单中。而是从保存表单中捕获内存中的Product实例并分配其business属性:

def form_valid(self, form):
    new_product = form.save(commit=False)
    # get current logged in user
    user = self.request.user.id
    # match the current logged in user to an owner in the Shop model
    s = Shop.objects.get(owner=user)
    # assign the shop instance to the product
    new_product.business = s
    # record the product to the database
    new_product.save()
    # This method is called when valid form data has been POSTed.
    # It should return an HttpResponse.
    return super(ProductCreate, self).form_valid(form)