为什么我在更新博客 post 时在 django 中出现兼容类型错误?

Why I am getting compitable type error in django while updating a blog post?

我正在尝试制作一个像 Twitter 这样的社交网站。当我尝试更新 post 时,它会在以下屏幕截图中显示错误。我找不到错误的实际原因。

views.py

    @login_required
def editpost(request,id):
    mainpost = get_object_or_404(NewPost,id = id)
    postform = NewPostForm(instance = mainpost)
    if request.method == "POST":
        postform = NewPostForm(request.POST, instance= mainpost)
        user = request.user.id
        timestamp = datetime.now()
        if postform.is_valid:
            post = postform.save(commit=False)
            postdata = NewPost(id = id,post = post,timestamp = timestamp)
            postdata.save()
            return HttpResponseRedirect(reverse("index"))

    return render(request,"network/editform.html",{
        "postform" : postform,
        "mainpost" : mainpost,
        "id" : id,
    })

models.py

class NewPost(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    post = models.TextField()
    timestamp = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return f"{self.post}"

urls.py

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("profile/<int:id>",views.profilepage,name="profile"),
    path("profile/<int:id>/following/addfollower",views.followersPeople,name="addfollower"),
    path("profile/<int:id>/following/removefollower",views.followersRemove,name="removefollower"),
    path("postform", views.createpost, name="postform"),
    path("editform/<int:id>",views.editpost,name="editpost"),
    path("following",views.followerspost,name="following"),
]+ static(settings.MEDIA_URL, document_root= settings.MEDIA_ROOT)

editform.html

{% extends 'network/layout.html' %}

{% block body %}
    <div style="margin: 70px 10px 10px 10px;">
        <!-- <h1>Create New Post</h1> -->
        <div class="border border-success" style="margin: 10px 10px 10px 10px; position: relative;">
            <div style="margin: 10px 10px 10px 10px;">
                <label>New post</label>
                <form id="NewPostForm" action="" method="POST">
                    {% csrf_token %}
                    <div class="form-group">
                        {{ postform }}
                    </div>
                
                    <input class="btn btn-success" type="Submit" value="Submit">
                </form>
            </div>
        </div>
    </div>
{% endblock %}

我遇到了这个错误:

编辑实例时,保存表单,因此:

from django.shortcuts import redirect

@login_required
def editpost(request,id):
    mainpost = get_object_or_404(NewPost, id=id)
    postform = NewPostForm(instance=mainpost)
    if request.method == 'POST':
        postform = NewPostForm(request.POST, instance=mainpost)
        timestamp = datetime.now()
        if postform.is_valid():  # 🖘 call is_valid()
            postform<b>.instance.timestamp = datetime.now()</b>
            postform.save()  # 🖘 save the form
            return redirect('index')

    return render(request, 'network/editform.html', {
        'postform' : postform,
        'mainpost' : mainpost,
        'id' : id,
    })

如果你想在每次编辑NewPost对象时更新时间戳,你可以使用auto_now=True [Django-doc],而不是auto_now_add=True:

class NewPost(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.TextField()
    timestamp = models.DateTimeField(<strong>auto_now=True</strong>)

    def __str__(self):
        return f'{self.post}'