Как обновить запись в модели 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