Создайте новую запись, используя другую для значений по умолчанию

Как лучше всего реализовать функцию, при которой пользователь выбирает существующую запись в качестве шаблона для создания новой?

В идеале я хотел бы получить список всех существующих записей в 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> 
Вернуться на верх