如何保存不属于表单但在Django中需要的字段

时间:2009-07-15 13:05:53

标签: django django-forms

我有一个模型,其中包含一个需要但不是由用户输入的字段,我很难保存模型而没有错误。我的模型定义如下:

class Goal(db.Model):
  author = db.UserProperty(required=True)
  description = db.StringProperty(multiline=True, required=True)
  active = db.BooleanProperty(default=True)
  date = db.DateTimeProperty(auto_now_add=True)

class GoalForm(djangoforms.ModelForm):
  class Meta:
    model = Goal
    exclude = ['author', 'active']

我在appengine中使用django-forms来创建和验证表单。当我试图保存这个表格的结果但是......

  def post(self):

    data = GoalForm(data=self.request.POST)

    if data.is_valid():

      goal = data.save(commit=False)
      goal.author = users.get_current_user()

      goal.put()
      self.redirect('/')

我得到“ValueError:无法创建目标(需要属性作者)”

现在我认为通过让commit = False,然后为Goal添加属性,然后保存对象将允许我这样做但显然它不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

  

请注意,如果表单中的数据未验证

,save()将引发ValueError

您可以在此处找到有关save()方法的所需信息:

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

编辑:而不是goal.put(),执行goal.save()

编辑2:这可以解决您的问题:

goal = Goal(author='Mr') #example
data = GoalForm(data=self.request.POST, instance=goal)

答案 1 :(得分:1)

我意识到这是一个老问题,但为了寻找类似答案的其他人,我发布了以下内容:

除非我因为没有这样做而错过了,但我相信这就是你所需要的:

class Goal(db.Model):
  author = db.UserProperty(auto_current_user_add=True)
  ...
  ...

供参考: Types and Property Classes:class UserProperty()

答案 2 :(得分:0)

你的GoalForm应该继承自django.forms.ModelForm并被定义为只需要一些字段:

class GoalForm(django.forms.ModelForm):
    class Meta:
        model = Goal
        fields = ('description', 'etc')

不确定这是否完全适用于AppEngine。

您还应该保存表单(仍然不确定AppEngine):

data = GoalForm(data=self.request.POST)

if data.is_valid():
  data.author = users.get_current_user()
  data.put()