在不使用泛型类的情况下更新Django视图



我想我在这里不理解一些基本的东西,但是关于这个主题的每一个教程都提出了一个使用函数或泛型类的解决方案,它们都为我工作,但我不知道如何使用视图来处理这个问题。因此,为了说明我在哪里,我正在建立一个非常简单的博客,并希望根据它的id更新单个帖子的数据。所以我得到的是:

models.py

class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.CharField(max_length=100)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})

forms.py

class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = '__all__'

urls . py

urlpatterns = [
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update') 
]

update_post.html

<form method="post">
{% csrf_token %}
{{ isolated_post.as_p }}
<input type="submit" value="Update">
</form>

和最后的views.py

class PostUpdateView(View):
form_class = PostForm
initial = {'key': 'value'}
template_name = "blog/update_post.html"
def get(self, request, pk):
isolated_post = Post.objects.get(pk=pk)
form = self.form_class(instance=isolated_post)
return render(request, self.template_name, {'form': form})
def post(self, request, pk, form):
updated_post = self.form_class(request.POST, instance=form)
if updated_post.is_valid():
updated_post.save()
return HttpResponseRedirect("/post/" + f'{pk}/')
return render(request, self.template_name, {'updated_post': updated_post})

我尝试了很多东西,这次它说表单没有传递给post函数。但我最多能实现的是空表单,在我按下&;update&;后抛出一个错误。我想我只是不明白"后"的逻辑。很好,或者如何用我使用get函数的表单填充。

您的视图

class PostUpdateView(View):`
form_class = PostForm
template_name = "blog/update_post.html"
def setup(self, request, *args, **kwargs):
self.post_instance = get_object_or_404(Post, pk=kwargs['post_id'])
return super().setup(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
post = self.post_instance
form = self.form_class(instance=post)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
post = self.post_instance
form = self.form_class(request.POST, instance=post)
if form.is_valid():
new_post = form.save(commit=False)
new_post.save()
return redirect('your dynamic url', post.id)

最新更新