为了账号安全,请及时绑定邮箱和手机立即绑定

article_id = request.POST.get('article_id','0') 中不是已经设置了默认值为'0'吗? 为什么没有生效呢?

def edit_action(request):
    article_id = request.POST.get('article_id','0')
    title = request.POST.get('title','TITLE')
    content = request.POST.get('content','CONTENT')
    if article_id == '0':
        models.Article.objects.create(title=title,content=content)
        articles = models.Article.objects.all()
        return render(request,'blog/index.html', {'articles': articles})
    else:
        article = models.Article.objects.get(pk=article_id)
        article.title = title
        article.content = content
        article.save()
    return render(request, 'blog/article_page.html', {'article': article})

请问article_id = request.POST.get('article_id','0') 中不是已经设置了默认值为'0'吗? 为什么没有生效呢? 而是要通过过滤器来传递默认值'0'

正在回答

2 回答

Python中我们通常会用这么两种方法来获取字典里具体的某个值,一个是直接dict[key],另一个是dict.get(key, default)。

get方法中的default,是指如果key不存在,则输出这个default。

我们的代码中,前端这个article_id键是肯定存在的,所以不会出现找不到key的情况,也就不会用哪个'0'了。

这个是Python的知识,所以课程中没有仔细讲,主要目的是为了保证代码的健壮性,避免出现KeyError异常。因为平时写代码的时候我也会在某些场合习惯通过get方法来获取dict中的值,这样就省得处理异常了。正常的键值对的获取dict[key],要考虑key不存在时的异常情况,get方法不会抛KeyError。

1 回复 有任何疑惑可以回复我~
#1

ywang04 提问者

谢谢老师回复 我理解您说的关于Python字典取值方式 我的问题是当准备新建文章的时候 是没有article_id的 那么request.POST.get('article_id','0') 这个就可以保证在没有article_id的时候 取默认值为0。但是您在课程里提到了需要在html里再设置一次 <input type="hidden" name="article_id" value="{{ article.id|default:'0' }}"> 是否可以理解成default:'0'的优先级要更高一些。期待您的回复 谢谢
2017-02-11 回复 有任何疑惑可以回复我~
#2

慕后端6532889 回复 ywang04 提问者

兄弟,如果没有default:'0',那么request.POST.get('article_id','0') 得到的值是‘’(空字符串)啊。然后str(‘’) == '0' 么? 当然不等于!所以呢,会去执行else的语句,也就是去修改文章,修改文章要执行article = models.Article.objects.get(pk=article_id)这个语句啊,pk='',哪有主键为空的行啊!自然在查找数据库的时候会报错啦!虽然在这里,默认值不会起作用,但是写代码的时候还是会这样写的,比较bug总是在你想不到的时候发生的。
2017-03-04 回复 有任何疑惑可以回复我~

并不会默认给0,同样也不会默认TITLE和CONTENT

那为什么要这么写呢,希望有人解答

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
django入门与实践
  • 参与学习       65159    人
  • 解答问题       869    个

手把手带你进入Django开发的大门,充分领略Django的魅力

进入课程

article_id = request.POST.get('article_id','0') 中不是已经设置了默认值为'0'吗? 为什么没有生效呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信