form.cleaned_data returns 空集
form.cleaned_data returns empty set
我有一个表格:
class OrderForm(forms.Form):
delivery_time = models.CharField(max_length=100)
address_city = models.CharField(max_length=40)
address_street = models.CharField(max_length=40)
address_building = models.CharField(max_length=40)
这是我的观点:
def submit(request):
args = {}
args['form'] = OrderForm()
if request.POST:
order_form = OrderForm(request.POST)
if order_form.is_valid():
user = request.user
address_city = order_form.cleaned_data.get('address_city')
address_street = order_form.cleaned_data.get('address_street')
address_building = order_form.cleaned_data.get('address_building')
delivery_time = order_form.cleaned_data.get('delivery_time')
new_order = Order(address_city=address_city,
address_street=address_street,
address_building=address_building,
delivery_date=delivery_time, client=user)
new_order.save()
Basket.objects.filter(client=user).delete()
return redirect('/order/')
else:
args['form'] = order_form
else:
return render(request, 'order_page.html', args)
我想问题出在我的模板上:
<form class="form-horizontal" action="{% url 'order_submit' %}" method="post">
{% csrf_token %}
<div class="control-group">
<label class="control-label" for="address">City<sup>*</sup></label>
<div class="controls">
<input type="text" id="address" placeholder="City name" name="address_city">
</div>
</div>
...
我想问题是我不只使用 {{form}}
。但我确实需要这些样式来形成我的表单。我对我的注册模板做了同样的事情并且它有效。注册表单继承了UserCreationForm
,绑定了User
模型,但是我的OrderForm继承了form.Form
。它可以是什么?
Order model:
class Order(models.Model):
state_choices = ('ACTIVE', 'COMPLETED', 'FROZEN')
order_date = models.DateTimeField(auto_now_add=True)
delivery_time = models.CharField(max_length=100)
address_city = models.CharField(max_length=40)
address_street = models.CharField(max_length=40)
address_building = models.CharField(max_length=40)
state = models.CharField(max_length=200, default='ACTIVE')
client = models.ForeignKey(CustomUser)
这里的基本问题在于表单的定义。表单不适用于模型字段,但需要表单字段。只有这样才能正确构建字段。
from django import forms
class OrderForm(forms.Form):
delivery_time = forms.CharField(max_length=100)
address_city = forms.CharField(max_length=40)
address_street = forms.CharField(max_length=40)
address_building = forms.CharField(max_length=40)
之后尝试在模板中输出 {{ form }}
。
<form action="foo" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="submit"/>
</div>
您不应该创建 form.Form
class 来显式处理每个字段。您可以从 forms.ModelForm
subclass 代替,让模型表单为您处理一切。
问题已经被指出了,但是我还是坚持大家尽量使用模型形式而不是普通形式。
这是您的表单 class 和视图的重写版本:
forms.py
class OrderForm(forms.ModelForm):
class Meta:
model = Order
exclude = ['order_date', 'client', 'state']
views.py
def submit(request):
if request.method == 'POST':
form = OrderForm(initial={'client': request.user}, data=request.POST)
if form.is_valid():
order = form.save(commit=False)
order.client = request.user
order.save()
Basket.objects.filter(client=request.user).delete()
return redirect('/order/')
else:
return render(request, 'order_page.html', {'form': form})
else:
return render(request, 'order_page.html', {'form': OrderForm()})
我有一个表格:
class OrderForm(forms.Form):
delivery_time = models.CharField(max_length=100)
address_city = models.CharField(max_length=40)
address_street = models.CharField(max_length=40)
address_building = models.CharField(max_length=40)
这是我的观点:
def submit(request):
args = {}
args['form'] = OrderForm()
if request.POST:
order_form = OrderForm(request.POST)
if order_form.is_valid():
user = request.user
address_city = order_form.cleaned_data.get('address_city')
address_street = order_form.cleaned_data.get('address_street')
address_building = order_form.cleaned_data.get('address_building')
delivery_time = order_form.cleaned_data.get('delivery_time')
new_order = Order(address_city=address_city,
address_street=address_street,
address_building=address_building,
delivery_date=delivery_time, client=user)
new_order.save()
Basket.objects.filter(client=user).delete()
return redirect('/order/')
else:
args['form'] = order_form
else:
return render(request, 'order_page.html', args)
我想问题出在我的模板上:
<form class="form-horizontal" action="{% url 'order_submit' %}" method="post">
{% csrf_token %}
<div class="control-group">
<label class="control-label" for="address">City<sup>*</sup></label>
<div class="controls">
<input type="text" id="address" placeholder="City name" name="address_city">
</div>
</div>
...
我想问题是我不只使用 {{form}}
。但我确实需要这些样式来形成我的表单。我对我的注册模板做了同样的事情并且它有效。注册表单继承了UserCreationForm
,绑定了User
模型,但是我的OrderForm继承了form.Form
。它可以是什么?
Order model:
class Order(models.Model):
state_choices = ('ACTIVE', 'COMPLETED', 'FROZEN')
order_date = models.DateTimeField(auto_now_add=True)
delivery_time = models.CharField(max_length=100)
address_city = models.CharField(max_length=40)
address_street = models.CharField(max_length=40)
address_building = models.CharField(max_length=40)
state = models.CharField(max_length=200, default='ACTIVE')
client = models.ForeignKey(CustomUser)
这里的基本问题在于表单的定义。表单不适用于模型字段,但需要表单字段。只有这样才能正确构建字段。
from django import forms
class OrderForm(forms.Form):
delivery_time = forms.CharField(max_length=100)
address_city = forms.CharField(max_length=40)
address_street = forms.CharField(max_length=40)
address_building = forms.CharField(max_length=40)
之后尝试在模板中输出 {{ form }}
。
<form action="foo" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="submit"/>
</div>
您不应该创建 form.Form
class 来显式处理每个字段。您可以从 forms.ModelForm
subclass 代替,让模型表单为您处理一切。
问题已经被
这是您的表单 class 和视图的重写版本:
forms.py
class OrderForm(forms.ModelForm):
class Meta:
model = Order
exclude = ['order_date', 'client', 'state']
views.py
def submit(request):
if request.method == 'POST':
form = OrderForm(initial={'client': request.user}, data=request.POST)
if form.is_valid():
order = form.save(commit=False)
order.client = request.user
order.save()
Basket.objects.filter(client=request.user).delete()
return redirect('/order/')
else:
return render(request, 'order_page.html', {'form': form})
else:
return render(request, 'order_page.html', {'form': OrderForm()})