【问题标题】:column slug is not unique柱塞不是唯一的
【发布时间】:2014-03-05 22:53:48
【问题描述】:

当我从表单添加数据并收到此错误时。 /open_shop/ 处的 IntegrityError 柱塞不是唯一的

但经过测试并独树一帜

class OpenShopForm(forms.ModelForm):
    class Meta:
        model = Shop


class OpenShop(CreateView):
    model = Shop
    form_class = OpenShopForm

def form_valid(self, form):
    f = form.save(commit=False)
    f.submitter = self.request.user
    if self.request.method == 'POST':
        f = OpenShopForm(self.request.POST)
    f.save()

    return super(CreateView, self).form_valid(form)

def get_success_url(self):
    return reverse("profile", kwargs={'slug': self.request.user})

如果我通过管理员添加相同的,它可以正常工作

此代码不保存图片:

class OpenShop(CreateView):
    model = Shop
    form_class = OpenShopForm

    def form_valid(self, form):
        f = form.save(commit=False)
        f.submitter = self.request.user
        f.save()
        return super(CreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse("profile", kwargs={'slug': self.request.user})

{% extends "base.html"%}
{% block content %}


   <form enctype="multipart/form-data" action="{% url 'addproduct' %}" method="post">{% csrf_token %}
        {{ form.non_field_errors }}
          <p>
            {{form.title.errors}}
            <label class="txtField" for="id_subject">Product name:</label>
            {{ form.title }}
        </p>
        <p>
            {{form.slug.errors}}
            <label class="txtField" for="id_subject">Slug:</label>
            {{ form.slug }}
        </p>
        <p>
            {{form.catalog.errors}}
            <label class="txtField" for="id_subject">Product catalog:</label>
            {{ form.catalog }}

        <p>
            {{form.subcatalog.errors}}
            <label class="txtField" for="id_subject">Product subcatalog:</label>
            {{ form.categories }}
        </p>

        <p>
            {{form.description.errors}}
            <label class="txtField" for="id_subject">Product descriptions:</label>
            {{ form.description }}
        </p>
        <p>
            {{form.price.errors}}
            <label class="txtField" for="id_subject">Product price:</label>
            {{ form.price }}
        </p>
        <p>
            {{form.sale_price.errors}}
            <label class="txtField" for="id_subject">Product sale price:</label>
            {{ form.sale_price }}
        </p>
        <p>
            {{form.is_active.errors}}
            <label class="txtField" for="id_subject">Product activity:</label>
            {{ form.is_active }}
        </p>
        <p>
            {{form.is_featured.errors}}
            <label class="txtField" for="id_subject">Product featured:</label>
            {{ form.is_featured }}
        </p>
        <p>
            {{form.quantity.errors}}
            <label class="txtField" for="id_subject">Product quantity:</label>
            {{ form.quantity }}
        </p>
        <p>
            {{form.shop.errors}}
            <label class="txtField" for="id_subject">Product shop:</label>
            {{ form.shop }}
        </p>


        <input type="submit" value="Submit" />
    </form>

{% endblock %

}

models.py

class Product(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    image = models.ImageField(verbose_name=u'Image', upload_to="product_pic", blank=True)
    catalog = models.ForeignKey(Catalog)
    subcatalog = models.ManyToManyField(Subcatalog)
    description = models.TextField(blank=True, help_text="Describe product")
    submitter = models.ForeignKey(User, related_name="product vendor")
    price = models.DecimalField(max_digits=15, decimal_places=2)
    sale_price = models.DecimalField(max_digits=15, decimal_places=2)
    is_active = models.BooleanField(default=True)
    is_featured = models.BooleanField(default=False)
    quantity = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    shop = models.ForeignKey(Shop)


    def __unicode__(self):
        return self.title

【问题讨论】:

  • f = OpenShopForm(self.request.POST) 不会完全关闭 f.submitter 行吗?如果我理解正确,提交者就是 slug,所以如果你覆盖该行,那么不会分配 slug
  • 并使用request.POST 保存图片??这是零意义,因为文件被传输到request.FILES 而不是request.POST
  • 也不保存。我坚持大写...
  • 好吧,根据the docs,您不需要调用save,它应该会自动调用。你能分享你的html表单吗?

标签: django python-2.7 django-forms slug


【解决方案1】:

我不知道为什么你在form_valid 中有这两行以if self.request.method == 'POST' 开头。只有在表单有效时才会调用该方法,这只有在首先从 POST 实例化时才会发生。正如 yuvi 所指出的,在该语句中,您将使用基于 POST 的新表单替换现有表单,覆盖您之前设置 submitter 所做的操作。

【讨论】:

  • 这些字段已被添加,因为它们没有保存表单中的图片。 class OpenShop(CreateView): model = Shop form_class = OpenShopForm def form_vaalid(self, form): f = form.save(commit=False) f.submitter = self.request.user f.save() return super(CreateView, self).form_valid(form) def get_success_url(self): return reverse("profile", kwargs={'slug': self.request.user})
  • @wadadaaa 请将该代码编辑到您的原始帖子中,这样不可读
【解决方案2】:

诚然,我从未使用过基于类的视图,而且文档也相当含糊。但试试:

 def form_valid(self, form):
    form.instance.submitter = self.request.user
    return super(CreateView, self).form_valid(form)

【讨论】:

  • 'AddproductForm' object is not callable
  • 尝试完全删除第一行。
  • IntegrityError at /addproduct/ products_product.submitter_id may not be NULL
  • 哦,快。我刚得到它。只需将值分配给 form.instance(不是表单),您无需保存任何内容或执行任何其他操作(文档提供了 extremely similar 示例)。
  • 不幸的是完全相同的错误IntegrityError at /addproduct/ products_product.submitter_id may not be NULL
【解决方案3】:

有效!

class AddProduct(CreateView):
        model = Product
        form_class = AddproductForm

        def form_valid(self, form):
            form.instance.submitter = self.request.user
            return super(AddProduct, self).form_valid(form)
        def get_success_url(self):
            return reverse("profile", kwargs={'slug': self.request.user})

【讨论】:

  • 所以,基本上,这和我的回答是一样的
猜你喜欢
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多