2014-02-08 54 views
1

當我從我的表單中添加數據並得到此錯誤。 IntegrityError在/ open_shop/ 列蛞蝓是不是唯一的列塞不是唯一的

,但經測試,並一決高下的唯一

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 
+1

不'f = OpenShopForm(self.request.POST)'完全關閉f.submitter行嗎?如果我理解正確,提交者是slu,子,所以如果你壓倒那條線,那麼沒有slu子被分配 – yuvi

+0

並使用'request.POST'保存圖片?這是毫無意義的,因爲文件被傳送到'request.FILES'而不是'request.POST'。 – yuvi

+0

也不保存。我卡住了...... – wadadaaa

回答

2

我不知道爲什麼你開始在form_validif self.request.method == 'POST'這兩條線。只有在表單有效的情況下才會調用該方法,只有在首先從POST實例化的情況下才會發生這種情況。正如yuvi指出的那樣,在這個聲明中,你將用一個基於POST的新的表單替換現有的表單,覆蓋你以前的設置submitter

+0

已添加這些字段是因爲它們沒有保存表單中的圖片。 '類OpenShop(CreateView的): 模型=商店 form_class = OpenShopForm DEF form_vaalid(個體,表格): F = form.save(提交=假) 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

+0

@wadadaaa please編輯該代碼到您的原始文章,這是不可讀的像這樣 – yuvi

1

不可否認,我從來沒有使用基於類的視圖,而且文檔相當模糊。但嘗試:

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

''AddproductForm'對象不可調用' – wadadaaa

+0

嘗試完全刪除第一行。 – yuvi

+0

'IntegrityError at/addproduct/ products_product.submitter_id不能爲空' – wadadaaa

1

它的工作原理!

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}) 
+0

因此,本質上,這與我的答案相同 – yuvi