更新基于 class 的详细视图中的数据

Update data inside class based detail view

我想让用户直接从详细视图编辑他们输入的数据。用户之前输入的数据也应该显示出来。

这是我现在的详细视图:

class GeographyDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = Geography

    def get_context_data(self, **kwargs):
        context = super(GeographyDetailView, self).get_context_data(**kwargs)
        context['form'] = GeographyForm()
        return context

    def post(self, request, pk):
        post=get_object_or_404(Geography, pk=pk)
        form = GeographyForm(request.POST)

        if form.is_valid():
            geo = form.save(commit=False)
            geo.student = self.request.user
            geo.save()
            return redirect('geography')
 
    def test_func(self):
        Geography = self.get_object()
        if self.request.user == Geography.student:
            return True
        return False here

现在当我提交表单时,没有更新数据,而是创建了一个新的。我也不知道如何用之前输入的数据预填表格。

这是我的 forms.py 文件

class GeographyForm(forms.ModelForm):
class Meta:
    model = Geography
    fields = ('title', 'rep1', 'rep2', 'rep3', 'rep4', 'rep5')

这是我的 html 模板

<div class="container px-5">
<h1>{{object.title}}</h1>
<div>
    <form action="" method="POST">
        {%csrf_token%}
        {{form}}
        <button type="submit">Bekräfta</button>
    </form>
</div>
<hr>

你在这里描述的本质上是一个UpdateView [Django-doc]。我建议您将其用于:

from django.urls import reverse_lazy

class GeographyDetailView(LoginRequiredMixin, UpdateView):
    model = Geography
    <strong>form_class = GeographyForm</strong>
    <strong>success_url = reverse_lazy('geography')</strong>
    template_name = '<i>some_template.html</i>'

    def get_queryset(self):
        return super().get_queryset().filter(
            student=self.request.user
        )

这应该足够了:它会将要编辑的对象作为 object 传递给上下文,并将表单作为 form 传递给渲染上下文。

表单应提交到与此相同的视图,如果表单有效,将重定向到 geography 视图。

get_queryset 过滤 student。这意味着它将 return HTTP 404 响应,以防旨在编辑对象的用户不是该对象的 student