Обновление данных в представлении деталей на основе класса

Я хочу позволить пользователю редактировать введенные им данные непосредственно из детального представления. Данные, которые пользователь ввел ранее, также должны отображаться.

Вот мой детальный вид прямо сейчас:

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 этого объекта.

Вернуться на верх