Как клонировать / дублировать запись, используя представления на основе классов, с наследованием модели?
Итак... Я пытаюсь объяснить: у меня есть "общая" модель (которая, безусловно, должна быть абстрактной) 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, если дублирование, Это все.
С Уважением,