Django模型表单和对象数据库id

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.

问题是:

  1. 有没有更好的方法来做到这一点?(从下拉菜单中选择或添加到位) - 更好或更多pythonic ;-)
  2. 使用ModelForms时如何获取保存的对象ID?

编辑

我的ContractorForm是:

class ContractorForm(ModelForm):
  class Meta:
    model = Contractor
Run Code Online (Sandbox Code Playgroud)

没有什么花哨.

Dav*_*cic 7

save()应该返回新创建的实例.

if contractor_form.is_valid():
  instance = contractor_form.save()
  parameters['contractor'] = instance
Run Code Online (Sandbox Code Playgroud)

id会是哪个instance.id,甚至更好instance.pk.

pk对比id:

无论您是自己定义主键字段,还是让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)