我之前使用过这段代码它运行正常,我建议使用另一个成员使用ModelForm,使用form.is_valid()函数等确实有意义。所以想试一试。
我在互联网上浏览了一些其他的例子,但我的某些原因似乎没有用,或者可能是我做得不对,当我在视图中打印表单时,我得到以下内容,它会转到else语句,所以我的表单没有保存
<input id="id_product" type="text" name="product" value="aassddf" maxlength="250" />
FAIL
我的model.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有更好的方法可以保存数据吗? 在此先感谢您的帮助。
答案 0 :(得分:3)
您应该阅读the documentation。如果表单无效,则会有一整套与之关联的错误,这将告诉您具体原因。但是你只需扔掉它,然后重定向到/product
。文档显示了如何使用错误重新显示表单。
此外,您不应直接在模板中编写HTML表单字段标记:使用视图中的表单对象 - {{ form.product }}
等 - 因为这些将在重新显示时使用适当的值重新填充。
答案 1 :(得分:2)
感谢Daniel Roseman和Anuj Gupta,我想我终于重新研究了我的代码,让它以标准方式工作,因此它将生成html表单并验证错误。
所以对于那些试图在这里工作django表单的人来说,就是我工作的代码。
我的 model.py 几乎与我发布的问题相同,但我删除了
class ProductForm(ModelForm):
class Meta:
model = Product
我创建了一个新的 form.py ,这里是代码 -
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>
这可能不是一个完美的解决方案,但对于像我这样的初学者来说这听起来不错,有时你只是在阅读docs大声笑时迷路了,希望它对某人有所帮助。
干杯
答案 2 :(得分:1)
尝试:
<form method="post" action="add_product/">
{% csrf_token %}
{{ form.as_p }}
</form>
在您的模板中,而不是手动编码表单的输入标记。此快捷方式将为您生成表单html,以及打印验证错误。
确保在以下情况下将form
对象返回给模板:
当然,这只是为了让你入门。你真的应该read the docs