【问题标题】:"Model object has no attribute 'save'"“模型对象没有属性‘保存’”
【发布时间】:2010-11-24 21:25:12
【问题描述】:

不知道如何处理此错误。如何使用 post 方法将表单中的数据添加到 SQL 中?

models.py

class Lala(models.Model):
    PRIORITY_CHOICES = ( 
        (0, '1'),
        (1, '2'),
        (2, '3'),
        (3, '4'),
     )
    name = models.CharField(max_length=20)
    date = models.DateField()
    priority = models.CharField(max_length=1, choices=PRIORITY_CHOICES)

Views.py

def add (request):
    if request.method == 'POST': # If the form has been submitted...
        form = AddLala(request.POST) # A form bound to the POST data
        if form.is_valid():
            newform = form.save()

Form.py

class AddLala(forms.Form):
    PRIORITY_CHOICES = ( 
        (0, '1'),
        (1, '2'),
        (2, '3'),
        (3, '4'),
     )
    name = forms.CharField(max_length=100)
    date = forms.DateField()
    priority = forms.CharField(max_length=1, widget=forms.Select(choices=PRIORITY_CHOICES))

添加.html

<form target="upload_frame" action="" method="post" enctype="multipart/form-data" >
 {% csrf_token %}
    {{ form.as_p }}<br>
    <input type="submit" name="submit" value="Upload" id="submit">
</form>

urls.py

  (r'^add/$', 'QA.QAtool.views.add'),
   (r'^addLala/$', 'QA.QAtool.views.addLala'),

所以,如果我走下一条路,我可以将数据添加到数据库 - 只需添加

 lala = Lala(id=None, name='teststep3', date='1943-12-12', priority='High') 
 lala.save()

我真的不明白哪里出了问题,我到处都看到 form.save() 作为标准方法,但不适合我。

【问题讨论】:

  • 你真的是要在视图中构造一个AddTest吗?
  • 没有表单操作...action='/add'
  • @mossplix:无关紧要。检查方法意味着不需要单独的 URL。
  • 据我从文档中得知,Django forms.Form 没有 具有 save() 方法 - 只有 ModelForm 实例具有该方法。哪个是合乎逻辑的 - 它应该保存什么以及保存在哪里?
  • 是的,这一切 - 网址和表单操作 - 我错过了,谢谢

标签: django


【解决方案1】:

尝试使用 ModelForm 而不是 Form:

class Lala(models.Model):
    PRIORITY_CHOICES = ( 
        (0, '1'),
        (1, '2'),
        (2, '3'),
        (3, '4'),
     )
    name = models.CharField(max_length=20)
    date = models.DateField()
    priority = models.CharField(max_length=1, choices=PRIORITY_CHOICES)

在forms.py中:

from django import forms

class LalaForm(forms.ModelForm):
    class Meta:
        model = Lala

那么在视图中你现有的代码应该(几乎)覆盖它:

def add (request):
    if request.method == 'POST': # If the form has been submitted...
        form = LalaForm(request.POST) # A form bound to the POST data
        if form.is_valid():
            form.save()    # saves a new 'Lala' object to the DB

查看 ModelForm here 的文档。

【讨论】:

  • 太好了,真的很有帮助,我怎么能错过它。现在的另一个问题 - 当我按下上传按钮时没有任何反应。 “等待本地主机”只有这个,屏幕上没有任何信息,只有我在控制台中的输出:/Library/Python/2.6/site-packages/django/template/defaulttags.py:52: UserWarning: A { % csrf_token %} 在模板中使用,但上下文未提供该值。这通常是由于没有使用 RequestContext 造成的。 warnings.warn("模板中使用了{% csrf_token %},但上下文没有提供值。这通常是由于没有使用RequestCon造成的
  • @user474092 - 可能想为此提出一个新问题。看起来您需要在请求上下文中放置一个 csrf 令牌,如 in the docs 所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
相关资源
最近更新 更多