Как обрабатывать кнопки сохранения и сохранения как в представлении на основе классов Django - PullRequest
0 голосов
/ 04 января 2019

То, что я хочу сделать, - это просто просмотр обновлений с двумя кнопками отправки: save, который просто сохраняет обновление; а также кнопку save-as, которая, конечно, сохраняет копию обновленной формы в базе данных и оставляет исходные данные неотредактированными.

Теперь я знаю, как это сделать в функциональном представлении, при условии, что у моего page_edit.html есть две кнопки:

<input type="submit" class="btn btn-danger" name = "save" value="Save changes">
<input type="submit" class="btn btn-success" name = "save_as" value="Save as new Page">

Тогда мое упрощенное представление будет чем-то вроде:

def page_edit(request, pk):
    if request.method == 'POST':
        if 'save' in request.POST:
            instance = Page.objects.get(pk=pk)
        elif 'save_as' in request.POST:
            instance = Page.objects.create()
        p = PageForm(request.POST, request.FILES, instance=instance)
        if p.is_valid():
            """write to db"""
            p.clean()
            p.save()

            context = {'form': p, 'p_data_in': p.cleaned_data, 'p': p.instance}
        return render(request, '/template/page_detail.html', context)

    else:
        instance = Page.objects.get(pk=pk)
        p = PageForm(instance=instance)
        context = {'form': p, 'p': p.instance}
        return render(request, '/template/page_edit.html', context)

Тем не менее, я немного озадачен навигацией по классам.

Я пытался использовать UpdateView следующим образом:

class PageEdit(UpdateView):
    model = Page
    form_class = PageForm
    template_name = '/template/page_edit.html'

    def form_valid(self, form):
        if 'save_as' in self.request.POST:
            # current = self.get_context_data()
            f = self.form_class(self.request.POST, self.request.FILES)
            f.save()
        return super(PageEdit, self).form_valid(form)

Сохраняет новый экземпляр в базе данных. Но это также меняет текущую форму, которая предположительно оставлена ​​неотредактированной.

У меня такое ощущение, что все должно быть просто ... но, поскольку я новичок в представлении на основе классов, я довольно борюсь.

Любая помощь будет высоко ценится. Спасибо:)

1 Ответ

0 голосов
/ 04 января 2019

На самом деле экземпляр был обновлен, потому что вы вызвали метод super, в котором были сохранены изменения (это оригинальное поведение. Поэтому вам нужно изменить его следующим образом:

def form_valid(self, form):
    if 'save_as' in self.request.POST:
        form = self.form_class(self.request.POST, self.request.FILES)  # Just changing the instance of the form.
        form.is_valid()
    return super(PageEdit, self).form_valid(form)
...