为什么无法获取Django模型主键的值?

下面是定义模型的代码

class Post(models.Model):
    id = models.IntegerField(primary_key=True)
    body = models.CharField(max_length=50000)
    timestamp = models.DateTimeField(auto_now=True)
    author_id = models.ForeignKey(settings.AUTH_USER_MODEL, default=None)

    def get_absolute_url(self):
        return reverse('display_post', args=[self.id])

下面是视图函数

@login_required
def new_post(request):
    form = PostForm()
    if request.method == 'POST':
        form = PostForm(data=request.POST)
        if form.is_valid():
            post = form.save(request.user)
            print(post.id)
            print(post.body)
            print(post.timestamp)
            print(post.author_id)
            # return redirect(post)
    return render(request, 'post.html', {'form': form})

这是数据库中的一条记录
15|hello world|2016-12-25 01:59:33.898952|zhou@zhou.com
15就是主键的值,除了print(post.id)为None外,其他都有值。
有谁知道为什么只有post.idNone,但又可以获取其他属性的值得原因吗?

PostForm代码

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('body',)

    def save(self, user_id):
        self.instance.author_id = user_id
        return super().save()
阅读 7.3k
3 个回答

Django 无需「显式地定义主键」

它会自动为表添加一个 id 字段( 主键, 自增 )

可以考虑把你手动定义的主键去掉

需要看清楚,你的post对象是PostForm()而非Post(),你的PostForm表单处理对象有id初始值,但是你传来的request.POST值有没有id值呢,没有就自然是None了,你这个post如果是Post()对象,那么肯定是有id值的

有一个信息不详细没给出,就是 PostForm 你是如何定义的。

如果你这么定义PostForm,通过调用PostForm(request.POST).save()是可以得到你想要的结果的。

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        

不过你的PostForm肯定不是这么定义的,因为post = form.save(request.user)是错误的使用方法,ModelFormsave方法只有一个参数,就是commit = False 或者 commit=True,表示是否将数据保存到数据库,默认True.

源码见链接

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题