Как клонировать / дублировать запись, используя представления на основе классов, с наследованием модели?

Итак... Я пытаюсь объяснить: у меня есть "общая" модель (которая, безусловно, должна быть абстрактной) GenericProduct и его дочерняя модель Product. Это дает мне 2 таблицы с некоторыми записями, конечно. Я хочу иметь возможность дублировать запись с помощью шаблонов. Для этого (представление на основе классов) я создал класс Duplicate (CreateView, UpdateView) и переписал метод get_object, чтобы установить для "pk" значение "None". Это работает, но pk, который я получаю, это pk второй таблицы... Так что "дублирование" не работает... Я могу дать вам некоторый код для тестирования.

Но я делаю это правильно? В моей общей модели я также создал метод

def duplicate(self):
    self.save(force_insert=True)

Как я мог использовать это?

Спасибо

Редактировать: добавление кода

models.py

from django.db import models

class GenericProduct(models.Model):
    name = models.CharField(max_length=100, unique=True)
    name = models.CharField(max_length=100)

    def duplicate(self): # can it help ?
        self.save(force_insert=True)


class Product(GenericProduct):
    pass

form.py

from django.forms.models import ModelForm

class ProductForm(ModelForm):
    class Meta:
        model = Product
        fields = '__all__'

views.py (~ CRUD)

from django.views.generic.list import ListView
from django.views.generic.edit import CreateView, UpdateView
from django.core.urlresolvers import reverse_lazy


class List(ListView):
    model = Product
    context_object_name = "products"
    template_name = "products.html"


class Update(UpdateView):
    model = Product
    form_class = ProductForm
    template_name = "product.html"
    success_url = reverse_lazy('products')

    def get_object(self):
        reference = self.kwargs['reference']
        p = self.model.objects.get(reference=reference)
        p.pk = None
        return p


class Duplicate(CreateView, UpdateView):
    model = Product
    template_name = "product.html"
    success_url = reverse_lazy('products')
    form_class = ProductForm

    def get_object(self):
        reference = self.kwargs['reference']
        p = self.model.objects.get(reference=reference)
        p.genericproduct_ptr_id = None
        return p

products.html (чтобы получить список)

<html>
<body>
<style>
    table {
        border: 1px solid black;
        border-collapse: collapse;
    }
    td, th {
        border: 1px solid black;
        padding: 3px 7px;
    }
</style>
<table>
    <tr>
        <th>actions</th>
        <th>reference</th>
        <th>name</th>
    </tr>
{% for product in products %}
    <tr>
        <td>
            <a href="{% url 'duplicate' product.reference %}">duplicate</a>
        </td>
        <td>
            <a href="{% url 'update' product.reference %}">
                {{ product.reference }}
            </a>
        </td>
        <td>{{ product.name }}</td>
    </tr>
{% empty %}
    <tr>
        <td>no entry</td>
    </tr>
{% endfor %}
</table>
</body>
</html>

product.html (для редактирования / дублирования товара)

<html>
<body>
    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="OK" />
    </form>
    <p>
        <a href="{% url 'products' %}">
            back to list of products
        </a>
    </p>
</body>
</html>

1 ответ

Я делаю свой комментарий как ответ, поскольку я удовлетворен этим:-)!!

Так что в models.py, нет необходимости def duplicate(self): self.save(force_insert=True)В views.py нет необходимости Duplicate учебный класс. Я тоже добавляю urls.py:

from django.conf.urls import url

urlpatterns = [
    url(r'^products/?$', List.as_view(), name='products'),
    url(r'^create/?$', Create.as_view(), name='create'),
    url(r'^edit/(?P<reference>.*)/?$', Update.as_view(), name='update'),
    url(r'^duplicate/(?P<reference>.*)/?$', Update.as_view(), name='duplicate'),
]

И где это возможно, в product.html:

<html>
<body>
    {% if "duplicate" in request.path|cut:"/" %}{% url "create" as URL %}{% endif %}
    <form action='{{ URL }}' method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="OK" />
    </form>
    <p>
        <a href="{% url 'products' %}">
            back to list of products
        </a>
    </p>
</body>
</html>

Хитрость заключается в том, чтобы проанализировать URL-адрес, чтобы узнать, отображаем ли мы форму как создание или как дублирование. Мы также могли бы передать аргумент в конфигурации URL, но у нас уже есть информация в URL, так что... И затем форма отправляется в значение атрибута действия: "" (пусто), если обновление, создание URL, если дублирование, Это все.

С Уважением,

Другие вопросы по тегам