【问题标题】:Django model form and objects database idDjango 模型表单和对象数据库 ID
【发布时间】:2011-04-08 22:25:06
【问题描述】:

我有一个复杂的 django 对象,它具有其他类类型的属性。变成这样:

class Order:
   contractor - type Person
   some other fields....

在我的表单中,我希望能够从下拉列表中选择现有的 Person 对象,或者使用表单添加一个新对象。我已经设法创建表单和适当的工作流程,但问题在于保存订单本身,我根本无法获取已保存的 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})

因此,如果 POST 请求到达此方法,我首先检查是否已填写 ContractorForm - 我假设如果表单有效,则它应该被使用。如果是,那么我保存它并希望将保存的对象的数据库 ID 分配给适当的字段,以便 OrderForm 找到它。

我所有的表单都是 ModelForms。

问题是:

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

已编辑

我的 ContractorForm 是:

class ContractorForm(ModelForm):
  class Meta:
    model = Contractor

没什么特别的。

【问题讨论】:

标签: django django-models django-forms


【解决方案1】:

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

if contractor_form.is_valid():
  instance = contractor_form.save()
  parameters['contractor'] = instance

id 应该是instance.id,或者更好的是instance.pk

pk vs. id:

无论您是否定义了 自己的主键字段,或者让 Django 为您提供一个,每个模型 将有一个名为 pk 的属性。它 表现得像一个正常的属性 模型,但实际上是 哪个属性是主键 模型的字段。你可以阅读和 设置这个值,就像你想要的一样 任何其他属性,它会 更新模型中的正确字段。

评论跟进:

默认情况下它确实有效,所以肯定有其他问题。

models.py

class Category(models.Model):
    name = models.CharField(max_length=70)
    slug = models.SlugField()

forms.py

from django import forms
from models import Category

class MyModelForm(forms.ModelForm):
    class Meta:
        model = Category

在 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

【讨论】:

  • 这是我的第一个猜测,但不幸的是它不是这样工作的。 ModelForm.save() 返回无。应该有一种方法可以通过重载的 save() 方法来做到这一点,但这似乎过于复杂和混乱。
  • 好吧,我再次测试了这个,你的解决方案有效。但是,我会根据我的具体情况对其进行更彻底的测试。
猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多