2014-02-08 1 views
1

내 양식의 데이터를 추가 할 때이 오류가 발생합니다./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 
+1

'f = OpenShopForm (self.request.POST)'가'f.submitter' 행을 완전히 닫지 않습니까? 만약 내가 올바르게 이해한다면, 제출자는 슬러그입니다. 그래서 당신이 그 라인을 오버라이드한다면, 슬러그는 – yuvi

+0

으로 지정되고'request.POST'를 사용하여 그림을 저장합니까 ?? 이는 파일이'request.POST'가 아니라'request.FILES'로 전송되기 때문에 의미가 없습니다. – yuvi

+0

도 저장되지 않습니다. 나는 capitally 붙어 ... – wadadaaa

답변

2

당신이 form_valid에서 if self.request.method == 'POST'을 시작하는 두 라인을 가지고 왜 아무 생각이 없습니다. 이 메소드는 양식이 유효한 경우에만 호출되며, POST에서 처음 인스턴스화 된 경우에만 발생할 수 있습니다. yuvi가 언급했듯이, 그 성명 안에서 당신은 기존 폼을 POST에 기반한 새로운 폼으로 대체하고 이전에 설정 한 것을 덮어 쓰며 submitter을 설정합니다.

+0

양식의 그림을 저장하지 않았기 때문에이 필드가 추가되었습니다. '클래스 OpenShop (CreateView) : 모델 = 숍 form_class = OpenShopForm 데프 (자체 양식) form_vaalid : (= 거짓 커밋) F = form.save을 f.submitter = self.request.user f.save() 반환 슈퍼 (CreateView, 자기) .form_valid (양식) 데프 get_success_url (자동) : 반환 역 ("프로필", kwargs로 = { '슬러그'self.request.user})' – wadadaaa

+0

@wadadaaa하십시오 이 코드를 원래 게시물에 편집하면 다음과 같이 읽을 수 없습니다. – 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가 NULL이 아닐 수도 있습니다 .' – 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