更新基于 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
。
我想让用户直接从详细视图编辑他们输入的数据。用户之前输入的数据也应该显示出来。
这是我现在的详细视图:
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
。