Создайте новую запись, используя другую для значений по умолчанию
Как лучше всего реализовать функцию, при которой пользователь выбирает существующую запись в качестве шаблона для создания новой?
В идеале я хотел бы получить список всех существующих записей в ListView, а пользователь, щелкнув по одной из этих записей, попадает в CreateView, где поля заполняются значениями выбранной записи как новыми начальными значениями по умолчанию.
По сути, этот метод будет стандартным ListView-to-UpdateView, однако метод сохранения будет создавать новую запись вместо обновления?
Существует несколько способов сделать это. Вот простая идея:
Получите id нужного вам объекта в качестве шаблона и передайте его в качестве GET-параметра. Например, https://example.com/create/?copy_object=7
Затем, в вашем файле views.py, вместо form_class
используйте функцию get_form_class()
:
class MyCreateView(CreateView):
def get_form_class(self):
if self.request.GET.get('copy_object'):
copy_object = MyModel.objects.get(id=self.request.GET.get('copy_object'))
return MyFormClass(instance=copy_object)
else:
return MyFormClass
РЕДАКТИРОВАНИЕ:
Исправление вашего кода:
models.py
class movies(models.Model):
fk_user = models.ForeignKey(User, default='1', on_delete=models.CASCADE)
title = models.CharField(max_length=250)
fk_producer = models.ForeignKey(producers, default='1', on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
ordering = ('-id', )
views.py
from .forms import *
class movies_list(LoginRequiredMixin, ListView):
model = movies
template_name = 'movies_list.html'
class movies_create(LoginRequiredMixin, CreateView):
model = movies
fields = ['title', 'fk_producer']
template_name = 'movies_create.html'
def form_valid(self, form):
form.instance.fk_user = self.request.user
form.save()
# return super().form_valid(form)
return HttpResponseRedirect(self.request.path_info)
def get_form_class(self):
if self.request.GET.get('copy_object'):
copy_object = movies.objects.get(id=self.request.GET.get('copy_object'))
return MovieForm(instance=copy_object)
else:
return MovieForm
forms.py
class MovieForm(ModelForm):
class Meta:
model = movies
fields = ['title','fk_producer'] #fk_user is not necessary because you add it on form_valid function
movies_list.html
<table>
<tr>
<th>No.</th>
<th>Title</th>
</tr>
{% for movie in movie %}
<tr>
<td>{{ forloop.counter }}</td>
<td><a href="{% url 'movies_create' %}?copy_object={{movie.id}}">{{ movie.title }}</a></td>
</tr>
{% endfor %}
</table>