Как обновить запись в модели Django с помощью форм?

Я новичок в Django и нуждаюсь в помощи.

Я в основном пытаюсь создать Tinder-подобное приложение для фильмов, используя Django и работая над основами функциональности "пролистывания". При использовании формы у меня возникли проблемы с получением данных для пролистывания. Мне нужно только булево значение от пользователя (true - да, false - нет) и чтобы оно обновлялось в соответствии с id фильма в базе данных. Но я не могу выполнить это обновление. Вместо этого моя форма добавляет новую запись.

Возможно, более простой альтернативой было бы полностью удалить поле swipes из модели, просто использовать его как переменную и вести список фильмов, в которых эта переменная была выбрана как true. В этом случае я не смог получить доступ к id фильма, поэтому это тоже не удалось ;-;

Как мне заставить это работать простым эффективным способом?

Вот как выглядит мой models.py:

class Movie(models.Model):

    movie_name = models.CharField(max_length=300) # unique id for room
    movie_description = models.TextField(default='')
    movie_genre = models.CharField(max_length=100)
    movie_date_released = models.DateField(null=True)
    movie_swiped = models.BooleanField(default = False)
    
    # Override the __str__ method to return the firstname and lastname
    def __str__(self):
        return self.movie_name

    def is_exists(self):
        ''' Check whether a user exists in the database '''
        if Movie.objects.get(movie_name=self.movie_name): 
            return True
        else:
            return False

views.py

# Create your views here.

class RoomSwipeView(APIView):

    # Define a class variables 
    serializer_class = MovieSerializer
    queryset = []
    swiped_movies=[]

    def get(self, request):

        # Get the room id from the request
        movie_id = request.GET.get('id')
        
        if movie_id: 
            queryset = Movie.objects.filter(id=movie_id)

        else: 
            queryset = Movie.objects.all()
        
        print(queryset)
        print("BRUHHHH")
        
        form = MovieSwipeForm
        
        return render(request,'swipe.html',{'details':queryset, 'form':form})

    def post(self, request):
        form = MovieSwipeForm(request.POST)
        submitted = False
        if request.method == "POST":
            if form.is_valid():
                print("Getting here!!!!!!!")
                swiped = form.save(commit=False)
                if(swiped.movie_swiped):
                    swiped_movies.push(swiped)
                    print(swiped_movies)
        else:
            form = MovieSwipeForm
            if 'submitted' in request.GET:
                submitted = True

        return render(request,'swipe.html',{'details':queryset, 'form':form,'submitted':submitted})

Другая проблема в этом файле заключается в том, что переменные класса movies_swiped и queryset не обращаются к методу post, что тоже приводит к ошибке.

swipe.html

<html>
    <body>
        <h1> Movie Details</h1>
        {% for obj in details %}
        {{obj.movie_name}}<br/>
        Description: {{obj.movie_description}}<br/>
        Genre: {{obj.movie_genre}}<br/>
        Date Released: {{obj.movie_date_released}}<br/>
        <!-- <button type="button">YES</button>
        <button type="button">NO</button> -->
        {% if submitted %}
            Success
        {% else %}
            <form action="" method="post">
                {% csrf_token %}
                {{ form.as_p }}
                <input type="submit" value="Submit">
                <!-- <input type="submit" value="NO"> -->

            </form>
        {% endif %}
        <br/><br/>       
        {% endfor %}
    </body>
</html>

forms.py

class MovieSwipeForm(ModelForm):
    class Meta:
        model = Movie
        fields = ('movie_swiped',)

Вам нужно передать экземпляр объекта movie, который вы хотите обновить, в форму при инициировании формы, таким образом будет обновлен существующий объект, иначе form.save() создаст новый объект вместо него

В view.py

Instance = Movie.objects.get(id=movie_id)

form = MovieSwipeForm(request.POST, instance=instance)

Чтобы получить доступ к параметрам класса в классе, нужно назвать их self.parameter, поэтому для доступа к queryset в post-методе используйте self.queryset

Вернуться на верх