我想讓用戶直接從詳細視圖中編輯他們輸入的資料。還應顯示用戶先前輸入的資料。
這是我現在的詳細視圖:
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>
uj5u.com熱心網友回復:
你在這里描述的本質上是一個UpdateView[Django-doc]。我建議您將其用于:
from django.urls import reverse_lazy
class GeographyDetailView(LoginRequiredMixin, UpdateView):
model = Geography
form_class = GeographyForm
success_url = reverse_lazy('geography')
template_name = 'some_template.html'
def get_queryset(self):
return super().get_queryset().filter(
student=self.request.user
)
這應該就足夠了:它將傳遞物件以編輯object背景關系,并將表單form傳遞給渲染背景關系。
表單應提交到與此視圖相同的視圖,并geography在表單有效的情況下重定向到視圖。
上的get_queryset過濾器student。這意味著如果旨在編輯物件的用戶不是該物件的用戶,它將回傳 HTTP 404 回應student。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/420198.html
標籤:
