【问题标题】:Django Class Based UpdateView does not make any changes/Update the model it is called on基于 Django 类的 UpdateView 不进行任何更改/更新它所调用的模型
【发布时间】:2020-08-18 21:55:50
【问题描述】:

我刚开始学习 Django 并试图创建一个简单的博客网站,但由于某种原因,我无法通过 UpdateView 更新我的博客。每次我从更新博客页面点击提交按钮时,它都会让我回到详细视图页面而不做任何更改。除了 UpdateView 之外,其余部分似乎都可以正常工作,例如 CreateView、DeleteView、ListView。

这里是views.py的代码-

class PostDetailView(DetailView):
    model = Post
    template_name = 'posts/post.html'
    context_object_name = 'obj'
    form = CommentForm

    def get_object(self):
        obj = super().get_object()
        if self.request.user.is_authenticated:
            PostView.objects.get_or_create(user=self.request.user,post=obj)
        return obj

    def get_context_data(self, *args, **kwargs):
        CatCount = Category_Count()
        context = super().get_context_data(*args, **kwargs)
        context['latest'] = Post.objects.order_by('-date_added')[0:3]
        context['Category_Count'] = CatCount
        context['form'] = self.form
        return context

    def post(self, request, *args, **kwargs):
        form = CommentForm(request.POST)
        if form.is_valid():
            post = self.get_object()
            form.instance.Author = request.user
            form.instance.post = post
            form.save()
            return redirect('post', pk=post.pk)
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    form_class = PostForm
    success_url ="/"

    def get_object(self):
        obj = super().get_object()
        if self.request.user.is_authenticated:
            PostView.objects.get_or_create(user=self.request.user,post=obj)
        return obj
    def form_valid(self,form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post=self.get_object()
        if self.request.user == post.Author:
            return True
        return False

class PostDeleteView( LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    success_url='/'

    def test_func(self):
        post=self.get_object()
        if self.request.user == post.Author:
            return True
        else:
            return False

class PostCreateView( LoginRequiredMixin, CreateView):
    model = Post
    template_name = 'posts/Create.html'
    form_class = PostForm 

    def form_valid(self, form):
        form.instance.Author = self.request.user
        return super().form_valid(form)

这是表格,我在 UpdateView 中使用 -

class PostForm(forms.ModelForm):
    Content = forms.CharField(widget=TinyMCEWidget(
            attrs={'required': False, 'cols': 30, 'rows': 10}
        ))

    class Meta:
        model = Post
        fields= ['title', 'thumbnail', 'Content','Categories', 'featured']

这里是UpdateView的模板-

{%  extends 'posts/base.html'  %}
{% load crispy_forms_tags %}
{% block content %}

<div class='col-100 offset-1 mb-6 mt-4'>  <h3> Update </h3>
</div>
<div class='col-4 offset-2 mb-5 mt-5'>
  {{form.media}}
  <form method ='POST' action ='.' enctype = 'multipart/form-data'>
    {% csrf_token %}

    {{form|crispy}}
    <button class="btn btn-primary" type="submit">Submit</button>

  </form>
    
</div>


{% endblock content %}

这是项目的链接,以防万一-https://github.com/k-ken-source/DailyBlog-/blob/master/posts/views.py

我不知道我做错了什么,所以任何提示将不胜感激。提前谢谢你。

【问题讨论】:

  • 您收到什么错误等。您确定发出 POST 请求,并触发 UpdateView
  • 首先修复缩进,同时提供stackoverflow.com/help/minimal-reproducible-example
  • 嗨,我很抱歉缩进不好,并已修复。我还添加了 UpdateView 和 @Willem Van Onsem 的模板,如您所见,我正在发出 POST 请求。所以这似乎不是问题。

标签: python django


【解决方案1】:

发现问题出在你的模板post_form.html

<form method='POST' action='.'></form>

action='.' 给你带来了麻烦。这会建议浏览器将数据发送到不同的 URL,但您需要将数据发送到您的UpdateView 的 URL。

删除此属性,它会按预期工作。

【讨论】:

  • 您好,感谢您的帮助,是的,这似乎是问题所在。现在一切正常。
猜你喜欢
  • 2011-09-05
  • 2015-01-13
  • 2012-03-05
  • 2013-08-22
  • 2020-04-24
  • 2020-01-26
  • 2016-06-10
  • 1970-01-01
  • 2013-12-19
相关资源
最近更新 更多