Skip to main content
 首页 » 编程设计

python之Django 的 CreateView 没有保存对象

2025年05月04日28qq号

我正在练习 Django 的通用 View ,尤其是 ModelForms

这些是我的观点和模型

模型.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 
    post_date = models.DateTimeField('date posted') 
 
    def get_absolute_url(self): 
        return reverse('user-detail', kwargs={'pk': self.pk}) 
 
    def __unicode__(self): 
        return self.post_title 

表单.py

class PostForm(forms.ModelForm): 
    post_title = forms.CharField( 
        label=u'Title', 
        widget=forms.TextInput(attrs={'size':64}) 
    ) 
    post_content = forms.CharField( 
        label=u'Content', 
        widget=forms.TextInput(attrs={'size':128}) 
    ) 
    class Meta: 
        model = Post 

views.py

class PostCreate(CreateView): 
    fields = ['post_title', 'post_content'] 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm    
 
    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
        return super(PostCreate, self).dispatch(*args, **kwargs) 
 
    def form_valid(self, form): 
        self.object = form.save(commit=False) 
        self.object.user = self.request.user 
        self.object.post_date = datetime.now() 
        return super(PostCreate, self).form_valid(form) 

该 View 似乎工作正常,未显示任何错误。但是,当我在提交表单并保存帖子后检查 Django 管理页面时,由于某种原因帖子没有保存到数据库中。

知道为什么会这样吗?

请您参考如下方法:

正如我从您使用的代码中看到的

self.object = form.save(commit=False) 

这意味着该对象不会保存到数据库中,但您可以将其用于进一步处理。所以你应该使用这样的东西:

self.object = form.save(commit=False)  # Not hit database 
self.object.user = self.request.user  # Update user 
self.object.post_date = datetime.now()  # Update post_date 
self.object.save()  # And finally save your object to database.