Mar*_*lke 3 django django-models django-forms
我有一个复杂的django对象,它具有其他类类型的属性.这是这样的:
class Order:
contractor - type Person
some other fields....
Run Code Online (Sandbox Code Playgroud)
在我的表单中,我希望能够从下拉列表中选择现有的Person对象,或者添加一个带有表单的新对象.我已经设法创建表单和适当的工作流程,但问题是保存Order本身,我根本无法获取已保存的Person实例的id.我这样做:
def make_order(request):
if request.method == 'POST':
parameters = copy.copy(request.POST)
contractor_form = ContractorForm(parameters)
if contractor_form.is_valid():
contractor_form.save()
parameters['contractor'] = ???
form = OrderForm(parameters)
if form.is_valid():
form.save()
return HttpResponseRedirect('/orders/')
else:
form = OrderForm()
contractor_form = ContractorForm()
return render_to_response('orders/make_order.html', {'order_form' : form, 'contractor_form' : contractor_form})
Run Code Online (Sandbox Code Playgroud)
因此,如果POST请求到达此方法,我首先检查ContractorForm是否已被填充 - 我假设如果表单有效,则表示要使用它.如果是,则保存,并希望将保存对象的数据库ID分配给适当的字段,以便OrderForm找到它.
我所有的表单都是ModelForms.
问题是:
编辑
我的ContractorForm是:
class ContractorForm(ModelForm):
class Meta:
model = Contractor
Run Code Online (Sandbox Code Playgroud)
没有什么花哨.
save()应该返回新创建的实例.
if contractor_form.is_valid():
instance = contractor_form.save()
parameters['contractor'] = instance
Run Code Online (Sandbox Code Playgroud)
id会是哪个instance.id,甚至更好instance.pk.
无论您是自己定义主键字段,还是让Django为您提供一个,每个模型都有一个名为pk的属性.它的行为类似于模型上的普通属性,但实际上是属于模型主键字段的属性的别名.您可以像读取任何其他属性一样读取和设置此值,它将更新模型中的正确字段.
跟进评论:
嗯,它默认工作,所以一定有其他错误.
models.py
class Category(models.Model):
name = models.CharField(max_length=70)
slug = models.SlugField()
Run Code Online (Sandbox Code Playgroud)
forms.py
from django import forms
from models import Category
class MyModelForm(forms.ModelForm):
class Meta:
model = Category
Run Code Online (Sandbox Code Playgroud)
在shell中测试:
In [3]: from katalog.forms import MyModelForm
In [4]: data = {'name':'Test', 'slug':'test'}
In [5]: form = MyModelForm(data)
In [6]: instance = form.save()
In [7]: instance
Out[7]: <Category: Test>
In [8]: instance.id
Out[8]: 5L
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7536 次 |
| 最近记录: |