Django:使用 from 创建对象时出错

Posted

技术标签:

【中文标题】Django:使用 from 创建对象时出错【英文标题】:Django: Error when creating objects using from 【发布时间】:2017-02-15 08:18:04 【问题描述】:

我一直在尝试使用表单来插入评论。当用户输入评论时,它会获取文章编号、用户名和评论正文并重定向到上一页。但是它一直显示错误消息,我无法准确找到我错过的部分。

这是model.py

class Comment(models.Model):
article_no = models.IntegerField(default=1)
comment_no = models.AutoField(primary_key=True)
comment_writer = models.CharField(max_length=50)
comment_body = models.CharField(max_length=300)
comment_date = models.DateTimeField(editable=False, default=datetime.now())

forms.py

class CommentForm(forms.ModelForm):

class Meta:
    model = Comment
    fields = ['article_no', 'comment_body', 'comment_writer']

view.py

@login_required
def comment(request, article_no):
user = request.user
request.session['username'] = user.username
if 'username' is None:
    return render(request, 'blog/home.html')
else:

    if request.POST.has_key('comment_body') == False:
        return HttpResponse('comment is none')
    else:
        if len(request.POST['comment_body']) == 0:
            return HttpResponse('comment is none')
        else:
            comment_body = request.POST['comment_body']
            print(comment_body)

    if request.POST.has_key('comment_writer') == False:
        return HttpResponse('writer is none')
    else:
        if len(request.POST['comment_writer']) == 0:
            return HttpResponse('comment is none')
        else:
            comment_writer = request.POST['comment_writer']
            print(comment_writer)

    try:        

            instance = CommentForm(Comment_body=comment_body, Comment_writer=comment_writer, Article_no=article_no)
            instance.save()
            instance.Comment += 1
            instance.save()
            #return HttpResponse('comment added')
            item = get_object_or_404(Article, pk=article_no)

            return render(request, 'blog/detail.html', 'item': item)

    except:
        print("A")
        return HttpResponse('error')
    print("B")
return HttpResponse('error')

urls.py

url(r'^comment/(?P<article_no>[0-9]+)/$', views.comment, name='comment'),

【问题讨论】:

它显示什么错误信息? 发布你得到了什么? @EvansMurithi 它说'__init__() 得到了一个意外的关键字参数'comment_body''。所以我认为这可能是由于在字段名称上加上大写字母造成的,所以我把它改成了小写。但是结果是一样的。 似乎成功获取评论作者、评论正文、文章编号但未能在数据库中创建或插入行。 instance = CommentForm(Comment_body=comment_body, Comment_writer=comment_writer, Article_no=article_no) instance.save() 是错误的。你传递一个字典(通常是request.POST)或initial=dict 【参考方案1】:

在这个问题中有 很多 非常奇怪的代码。一些建议:

在会话中设置username 没有意义,因为用户已经可以通过请求获得。 if 'username' is None 将文字字符串“用户名”与 None 进行比较,这永远不会是 True。 如果用户未登录,您应该重定向到主页,而不是呈现主页模板。 不要使用has_key;确定字典是否有键的正确方法是if key in dict。 不要将事物与== False 进行比较。表达式(inhas_key)的结果已经是一个布尔值,它是真或假。 您完全忽略了该表单,因为您直接将所有值与request.POST 进行比较。在调用form.is_valid() 之后,您应该使用form.cleaned_data dict。 但是无论如何您都不需要比较这些东西,因为它们正是表单验证所捕获的东西;这就是重点。 您不能将关键字参数传递给表单。您传递数据字典,即request.POST。然后拨打is_validsave。 实例化表单类的结果是表单实例,而不是模型实例。模型实例来自调用form.save()instance.Comment += 1 从字面上看完全没有意义;表单和模型都没有 Comment 属性。 永远不会做一个空白的尝试/例外。这只是隐藏了错误。完全删除这些语句。

【讨论】:

非常感谢,我修改了我的代码,它变得比以前更好了。

以上是关于Django:使用 from 创建对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

Django 教程第 3 部分:创建视图和模板时出错

在 VC++ 程序中使用 #import from MSOUTL.OLB 创建 .tlh 和 .tli 文件时出错

Django + Heroku 的测试数据库。创建测试数据库时出错:创建数据库的权限被拒绝

Python Django 1.9 迁移错误“创建新内容类型时出错...”

创建测试数据库时出错 - django、docker、mysql

在创建对象后自动释放对象时出错