3

以前はこのコードを使用していましたが、正常に機能し、別のメンバーから ModelForm を使用するように提案されました。form.is_valid() 関数などを使用するのは理にかなっています。試してみることを考えました。

私はインターネットで他の例をいくつか試しましたが、私のものは何らかの理由で機能していないようです。または、正しく行っていない可能性があります。ビューでフォームを印刷すると次のようになり、elseステートメントに移動します、だから私のフォームは保存されません

<input id="id_product" type="text" name="product" value="aassddf" maxlength="250" />
FAIL

私のモデル.py

from django.db import models
from django.forms import ModelForm

class Category(models.Model):
    name = models.CharField(max_length=250)

    def __unicode__(self):
        return self.name

class Product(models.Model):
    category = models.ForeignKey(Category)
    product = models.CharField(max_length=250)
    quantity = models.IntegerField(default=0)
    price = models.FloatField(default=0.0)

    def __unicode__(self):
        return self.product

class ProductForm(ModelForm):
    class Meta:
        model = Product

私のviews.py

from models import *
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

def index(request):
    ...
    ...

def add_product(request):
    if request.method == 'POST':
        form = ProductForm(request.POST)
        print form['product']
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/product')
        else:
            print 'FAIL'
    return HttpResponseRedirect('/product')

私のhtml

<form method="post" action="add_product/">
        {% csrf_token %}
        <label for="category">Category</label>
        <select name="category" id="category">
        {% for category in category_list %}
          <option> {{ category.name }} </option>
        {% endfor %}
        </select>

        <label for="product">Product</label>
        <input type="text" name="product" id="product">

        <label for="quantity">Quantitiy</label>
        <input type="text" name="quantity" id="quantity">

        <label for="price">Price</label>
        <input type="text" name="price" id="price">

        <input type="submit" value="Add New product" id="create">
    </form>

ModelForms を使用してデータを保存するより良い方法はありますか?? 助けてくれてありがとう。

4

3 に答える 3

3

ドキュメントを読む必要があります。フォームが有効でない場合は、それに関連する一連のエラーが発生し、その理由が正確にわかります。しかし、あなたはそれを捨てて、にリダイレクトし/productます。ドキュメントは、エラーのあるフォームを再表示する方法を正確に示しています。

また、HTML フォーム フィールド タグをテンプレートに直接記述しないでください。ビューからフォーム オブジェクトを使用してください -{{ form.product }}など - これらは再表示時に適切な値で再設定されます。

于 2012-10-03T12:11:45.780 に答える
2

Daniel Roseman と Anuj Gupta のおかげで、HTML フォームを生成してエラーを検証できるように、標準的な方法で動作するようにコードを最終的に作り直したと思います。

したがって、ここでdjangoフォームを操作しようとしている他の人のために、私が取り組んだコードがあります。

私のmodel.pyは、質問に投稿したものとほぼ同じでしたが、削除しました

class ProductForm(ModelForm):
    class Meta:
        model = Product

新しいフォームを作成しました。コードは次のとおりです-

from django import forms
from models import Category

class ProductForm(forms.Form):
    # Put all my Categories into a select option
    category = forms.ModelChoiceField(queryset=Category.objects.all())
    product = forms.CharField()
    quantity = forms.IntegerField()
    price = forms.FloatField()  

私のviews.pyの変更には多くの変更がありました-

def add_product(request):
    success = False

    if request.method == "POST":        
        product_form = ProductForm(request.POST)

        if product_form.is_valid():             
            success = True

            category = Category.objects.get(name=product_form.cleaned_data['category'])
            product = product_form.cleaned_data['product']
            quantity = product_form.cleaned_data['quantity']
            price = product_form.cleaned_data['price']

            new_product = Product(category = category, product = product, quantity = quantity, price = price )
            new_product.save()

            new_product_form = ProductForm()

            ctx2 = {'success':success, 'product_form':new_product_form}
            return render_to_response('product/add_product.html', ctx2 , context_instance=RequestContext(request))
    else:
        product_form = ProductForm()
    ctx = {'product_form':product_form}
    return render_to_response('product/add_product.html', ctx , context_instance=RequestContext(request))

最後に、私が使用したHTMLページ{{ product_form.as_p }}でフォームを動的に作成しました

{% if success %}
    <h3> product added successfully </h3>
{% endif %}         
<form method="post" action=".">
    {% csrf_token %}

    {{ product_form.as_p }}

    <input type="submit" value="Add New product" id="create">
    <input type="reset" value="reset" id="reset">   
</form>

これは完璧な解決策ではないかもしれませんが、私のような初心者にとっては良さそうです。

乾杯

于 2012-10-04T09:40:31.117 に答える
1

試す:

<form method="post" action="add_product/">
    {% csrf_token %}
    {{ form.as_p }}
</form>

フォームの入力タグを手作業でコーディングする代わりに、テンプレートで。このショートカットは、フォーム html を生成し、検証エラーを出力します。

form次の場合は、必ずオブジェクトをテンプレートに戻してください。

  1. リクエストはありません.POST (フォームが送信されていません)
  2. form.is_valid() が失敗します (フォームに検証エラーがあります)

もちろん、これは開始するためだけのものです。あなたは本当にドキュメントを読むべきです

于 2012-10-03T12:57:56.243 に答える