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

#python #django #database

Вопрос:

Я новичок в Джанго и нуждаюсь в некоторой помощи.

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

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

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

Вот что мое 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})   

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

swipe.html

 lt;htmlgt;  lt;bodygt;  lt;h1gt; Movie Detailslt;/h1gt;  {% for obj in details %}  {{obj.movie_name}}lt;br/gt;  Description: {{obj.movie_description}}lt;br/gt;  Genre: {{obj.movie_genre}}lt;br/gt;  Date Released: {{obj.movie_date_released}}lt;br/gt;  lt;!-- lt;button type="button"gt;YESlt;/buttongt;  lt;button type="button"gt;NOlt;/buttongt; --gt;  {% if submitted %}  Success  {% else %}  lt;form action="" method="post"gt;  {% csrf_token %}  {{ form.as_p }}  lt;input type="submit" value="Submit"gt;  lt;!-- lt;input type="submit" value="NO"gt; --gt;   lt;/formgt;  {% endif %}  lt;br/gt;lt;br/gt;   {% endfor %}  lt;/bodygt; lt;/htmlgt;  

forms.py

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

Комментарии:

1. пожалуйста, объясните, как вы пытаетесь пометить фильмы как прокрученные , также нет переменной с именем movies_swiped

2. Ой, опечатка. Я хотел сказать swiped_movies . Исправил это

Ответ №1:

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

В view.py

 Instance = Movie.objects.get(id=movie_id)  form = MovieSwipeForm(request.POST, instance=instance)    

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