Django Обновление вида сохранения, но не обновления - PullRequest
1 голос
/ 21 апреля 2020

Я создал рабочую форму для публикации отзывов о ресторанах.
Когда пользователь вошел в систему, он может видеть под своим сообщением кнопку редактирования.
Однако, когда я использую Updateview, он не редактирует, но вместо этого создает новую строку, в которой появляется новый отзыв (и эта новая строка не появляется на моей веб-странице).
Вот модель:

class UserReview(models.Model):
    # Defining the possible grades
    Grade_1 = 1
    Grade_2 = 2
    Grade_3 = 3
    Grade_4 = 4
    Grade_5 = 5
    # All those grades will sit under Review_Grade to appear in choices
    Review_Grade = (
        (1, '1 - Not satisfied'),
        (2, '2 - Almost satisfied'),
        (3, '3 - Satisfied'),
        (4, '4 - Very satisfied'),
        (5, '5 - Exceptionally satisfied')
    )
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    user_review_grade = models.IntegerField(default=None, choices=Review_Grade) # default=None pour eviter d'avoir un bouton vide sur ma template
    user_review_comment = models.CharField(max_length=1500)
    posted_by = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    def get_absolute_url(self):
        return reverse('restaurants:reviews', args=[self.id])

    def get_edit_url(self):
        return reverse('restaurants:edit-review', args=(self.id,))

Вот форма обновления ( аналогично форме обзора):

class EditReviewForm(forms.ModelForm):
    class Meta:
        model = UserReview
        fields = [
            'restaurant',
            'user_review_grade',
            'user_review_comment'
        ]
        widgets = {
            'restaurant': forms.HiddenInput,
            'user_review_grade': forms.RadioSelect,
            'user_review_comment': forms.Textarea
        }
        labels = {
            'user_review_grade': 'Chose a satisfaction level:',
            'user_review_comment': 'And write your comments:'
        }

Вот UpdateView:

class EditReview (LoginRequiredMixin, UpdateView):
    template_name = 'restaurants/review_edit.html'
    form_class = EditReviewForm
    model = UserReview
    slug = 'review'
    # Post the data into the DB
    def post(self, request, pk, *args, **kwargs):
        form = UserReviewForm(request.POST)
        restaurant = get_object_or_404(Restaurant, pk=pk)
        if form.is_valid():
            edit_review = form.save(commit=False)
            form.instance.posted_by = self.request.user
            print(edit_review)  # Print so I can see in cmd prompt that something posts as it should
            edit_review.save()
            return HttpResponseRedirect(reverse_lazy('restaurants:details', args=[restaurant.id]))
        return render(request, 'restaurants/details.html', {'form': form})

Есть ли у вас какие-либо идеи о том, что может быть не так? Спасибо:)

1 Ответ

1 голос
/ 21 апреля 2020

В режиме обновления вы забыли добавить экземпляр объекта в форму.

def post(self, request, pk, *args, **kwargs):
     obj = get_object_or_404(UserReview, pk=pk)
     form = UserReviewForm(request.POST, instance=obj)
...