Обновление данных в представлении деталей на основе класса
Я хочу позволить пользователю редактировать введенные им данные непосредственно из детального представления. Данные, которые пользователь ввел ранее, также должны отображаться.
Вот мой детальный вид прямо сейчас:
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
Сейчас, когда я отправляю форму, вместо обновления данных создается новая. Я также не знаю, как заполнить форму данными, которые были введены ранее.
То, что вы здесь описываете, по сути является 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 этого объекта.