Django - клонировать объект модели в ListView на основе классов - PullRequest
0 голосов
/ 21 января 2020

У меня есть list.html с большим количеством записей и столбцом, содержащим кнопку для клонирования указанной записи c, например:

{% for betr in object_list %}
    ....
    <td>
        <button type="button" class="btn btn-first" onclick="window.location='../clone/{{betr.ID}}';">
            <span class="fas fa-copy" style="font-size: 1rem;"></span>
        </button>
    </td>
{% endfor %}

Мой urls.py выглядит следующим образом:

urlpatterns = [
...
path('update/<int:pk>/', UpdateView.as_view(), name='update'),
path('clone/<int:pk>/', CloneView.cloneRecord(), name='clone'),
...
]

и my views.py содержит представление клонирования с функцией клонирования записи и открытия UpdateView с клонированной записью для редактирования:

class CloneView(LoginRequiredMixin):
    login_url = '/accounts/login/'
    model = mymodel
    def cloneRecord(self,**kwargs):
        record = mymodel.objects.filter(id=self.request.GET['ID'])[0]
        record.id = None
        record.save()
        return http.HttpResponseRedirect(reverse('/update/', kwargs={'pk':record.id}))

В данный момент я получаю следующая ошибка:

Ошибка типа: cloneRecord () отсутствует 1 обязательный позиционный аргумент: 'self'

Чего мне не хватает? Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

если у вас есть отдельные URL для обоих представлений, то вы должны написать свой код в GET методе, подобном этому

class CloneView(LoginRequiredMixin, View):
    login_url = '/accounts/login/'

    def get(self,**kwargs):
        record = mymodel.objects.filter(id=self.request.GET['ID'])[0]
        record.id = None
        record.save()
        return http.HttpResponseRedirect(reverse('/update/', kwargs={'pk':record.id}))

Ваш URL должен быть таким

path('clone/<int:pk>/', CloneView.as_view(), name='clone'),

Помните as_view используется для вызова представления на основе классов. Вы не можете изменить в соответствии с функцией, которую вы вызываете.

0 голосов
/ 21 января 2020

удалить скобки, CloneView.cloneRecord ()

path('clone/<int:pk>/', CloneView.cloneRecord, name='clone'),
...