为什么我在更新博客 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}'
我正在尝试制作一个像 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}'