2017-07-10 14 views
1

私はDjango/Pythonを使い始めました。 私のプロジェクトはここにありますgithub ProjectDjango - viewはHttpResponseを返しませんでした

私はこのエラーが発生しています。

ValueError at /salesapp/add/ashton-aged-maduro/ 
The view salesapp.views.add_CartItem didn't return an HttpResponse object. It returned None instead. 

私はProductAddToCartフォームを呼び出して、私のsingleproduct.htmlテンプレート上の「カートに入れる」ボタンをクリックしたときに、私はこのエラーを取得します。ビューはadd_CartItemです。

最初にフォームの値を設定しないと、エラーField is requiredも発生します。私は今、ちょうど立ち往生しています。

これはmodels.py

class Product(models.Model): 
    itemid = models.CharField(max_length=128, unique=True) 
    itemname = models.CharField(max_length=128) 
    brand = models.CharField(max_length=128) 
    image = models.ImageField(upload_to='static/images/') 
    notes = models.CharField(max_length=250) 
    price = models.IntegerField() 
    slug = models.SlugField(unique=True) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.itemname) 
     super(Product, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.itemname 

class CartItem(models.Model): 
    cart_id = models.CharField(max_length=50) 
    date_added = models.DateTimeField(auto_now_add=True) 
    quantity = models.IntegerField(default=1) 
    itemid = models.ForeignKey('Product', unique=False) 

    class Meta: 
     db_table = 'cart_items' 
     ordering = ['date_added'] 

    def name(self): 
     return self.product.name 

マイforms.py

class ProductAddToCartForm(forms.ModelForm): 
     cart_id = forms.CharField(max_length=50) 
     date_added = forms.DateTimeField() 
     quantity = forms.IntegerField() 
     slug = forms.CharField(widget=forms.HiddenInput(), required=False) 

     #itemid = models.ForeignKey('Product', unique=False) 

     class Meta: 
      model = CartItem 
      fields = ('cart_id', 'date_added', 'quantity', 'slug', 'itemid',) 

マイviews.py

def add_CartItem(request, product_name_slug): 
     print('In add_CartItem --------------------') 
    form = ProductAddToCartForm(request.POST) 

    p = Product.objects.get(slug=product_name_slug) 
    form = ProductAddToCartForm(initial={'cart_id': 123, 'date_added':date.date.today(), 'quantity': 1, 'slug':p.slug, 'id':p.id, 'itemid':p.itemid}) 
    form.save(commit=False) 
    print(form) 
    print(p.slug) 
    print(p.id) 
    print(p.itemid) 

    if form.is_valid(): 
     print(p) 
     print('In form.is_valid()--------------------------------') 

     ci = CartItem.objects.create(cart_id=1, date_added=date.date.today(), quantity=1, itemid=p) 

     form.save(commit=True) 
     return index(request) 
    else: 
     print(form.errors) #return render(request, 'salesapp/errors.html', {'form': form}) 

マイurls.py

です

と私のテンプレートでは、ProductAddToCartFormを表示したいが、商品をCartItemテーブルに追加したい。

<!DOCTYPE html> 
{% extends 'salesapp/base.html' %} 
{% load staticfiles %} 

{% block title_block %} 
    {{ product.itemname }} 
{% endblock %} 

{% block body_block %} 

    <div> 
     <div> 
      <ul style="list-style:none; text-align:center;"> 
       <li style="float:left; width:25%; margin:20px;"> 
         <img src="/{{ product.image }}"/> 
        <div> 
         <b>{{ product.itemname }}</b><br/> 
         Price per cigar:<br/> 
         <b>${{ product.price }}</b> 
         <p>{{ product.notes }}</p> 
        </div> 

        <form method="post" action="/salesapp/add/{{ product.slug }}/" class="cart"> 
         {% csrf_token %} 
         {% for hidden in form.hidden_fields %} 
          {{ hidden }} 
         {% endfor %} 
         {% for field in form.visible_fields %} 
          {{ field.errors }} 
          {{ field.help_text }} 
          {{ field }} 
         {% endfor %} 
         <br /> 
         <input type="submit" value="Add To Cart" name="submit" alt="Add To Cart" /> 
        </form> 
        <div class="cb"></div> 
       </li> 
      </ul> 
     </div> 
    <!-- More code --> 
    </div> 

{% endblock %} 
+1

あなたのビューの終わりを見る、views.py:そこにプリントがあります。そして応答の戻りません。したがって、エラーメッセージ。 – RemcoGerlich

+0

ありがとう、もう少し私を得たが、私のフォームはなぜ有効ではないのですか? – manderson

+0

おそらくそれが最初のレンダリングであるため、request.METHOD == 'POST'かどうかを確認するだけです。 – RemcoGerlich

答えて

1

ビューへの応答を返しませんでしたので、

docs

によるビュー機能は、単に がWeb要求を受け取り、ウェブを返すPythonの関数であります応答。

フォームの最初のレンダリングのために、あなたはジャンゴのredirect方法を使用することができます別のビューへのリダイレクトにrender方法を使用することを返す必要があります。

1

ビュー関数は、HttpResponseを返す必要があります。たとえば、プロセスが成功し、何も返さない場合は、返すことができます。HttpResponse(status=200)

ビューがフォームを処理するときは、GET要求とPOST要求を分割する必要があります。 GETパートでは、データなしでフォームをインスタンス化する必要があります。 POSTの部分では、フォームにrequest.POSTデータを入力します。このデータにはすべての必須フィールドが必要です。フォームを処理するための典型的なビュー機能スキームはfolowingである:あなたのテンプレートで

def view(request): 
    if request.method == "GET": 
     form = MyForm() 
     return ... 
    if request.method == "POST": 
     form = MyForm(request.POST) 
     form.save() 
     return ... 

、あなたはすべてのフォームフィールドを表示する必要があります。次に、すべてのフォームフィールドがリクエストと共に渡されます。あなたがいない場合は、ビューのフォームフィールドに入力する必要があります。ジャンゴのビュー機能は、JSONまたは辞書を返す必要がありますいずれか、またはあなたはどちらか 1を次のいずれかを行うことができます ウェブページを返すことができます)JSONまたは辞書

return {"value1":"value","value2":"value"} 

2)へのリダイレクトを返す

1

Webページ

return redirect('/some/url/') 

3)リターンHTTPレスポンス

return HttpResponse(status=<status code>,content="some content") 

4)あなたが質問をするとき、ほとんど、最初に、Djangoのフォームで作業するための正しい方法であることジャンゴ

def add_CartItem(request, product_name_slug): 
    form = ProductAddToCartForm(request.POST) 

    if request.method == 'POST': 
     if form.is_valid():  
      ci = CartItem.objects.create(cart_id=1, date_added=date.date.today(), quantity=1, itemid=p) 
      ci.save()#you save your model changes, not your form 
      return HttpResponseRedirect(reverse('your:url'))#your return the success url or the same 
     else: 
      #here error, if form isn't valid 
    else: 
     form = ProductAddToCartForm(request.POST) 
     return render(request, 'your/template.html', {'form': form}) 

に役に立たない、最初のプリントを削除するテンプレート

t = loader.get_template('myapp/index.html') 
c = {'foo': 'bar'} 
return HttpResponse(t.render(c, request), 
content_type='application/xhtml+xml') 
1

をレンダリングポストリクエストか通常リクエストかをブラウザに問い合わせるifステートメントを作成する必要があります。ポストリクエストであれば、フォームからデータを取り出し、データベースに追加します。そうでなければ、Djangoは空のテンプレートフォームを返します。

あなたが問題を解決したら教えてください

関連する問題