форма не обновляется после отправки кнопки «Мне нравится» - PullRequest
0 голосов
/ 31 октября 2019

При отправке кнопки после щелчка, как будто она создает объект успешно, но поле «Мне нравится» обновляется с нулевым значением, и django получает ошибку 302. Может кто-нибудь помочь мне с этим.

После редактирования

Я удалил form_valid функцию из SongVoteUpdateView Теперь обновление части работает нормально, но если я удалил form_valid функцию из SongVoteCreatView Itвыбрасывает интимную ошибку, как это NOT NULL constraint failed: album_vote.song_id. Для обратной трассировки, пожалуйста, обратитесь по этой ссылке , если ее не удалить, будет создан пустой объект без похожих.

models.py

Коды в models.py

class VoteManager(models.Manager):
    def get_vote_or_unsaved_blank_vote(self,song,user):
        try:
            return Vote.objects.get(song=song,user=user)

        except ObjectDoesNotExist:
            return Vote(song=song,user=user)

class Vote(models.Model):
    UP = 1
    DOWN = -1
    VALUE_CHOICE = ((UP, "?️"),(DOWN, "?️"),)


    like = models.SmallIntegerField(null=True, blank=True, choices=VALUE_CHOICE)
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    song = models.ForeignKey(Song, on_delete=models.CASCADE)
    voted_on = models.DateTimeField(auto_now=True)

    objects = VoteManager()

    class Meta:
        unique_together = ('user', 'song')

views.py

Коды в views.py

class SongDetailView(DetailView):
    model = Song
    template_name = 'song/song_detail.html'

    def get_context_data(self,**kwargs):
        ctx = super().get_context_data(**kwargs)
        if self.request.user.is_authenticated:
           vote = Vote.objects.get_vote_or_unsaved_blank_vote(song=self.object, user = self.request.user)
            if vote.id:
                vote_url = reverse('music:song_vote_update', kwargs={'song_id':vote.song.id,'pk':vote.id}) #'pk':vote.id
            else:
                vote_url = reverse('music:song_vote_create', kwargs={'song_id':vote.song.id})

            vote_form = SongVoteForm(instance=vote)
            ctx['vote_form'] = vote_form
            ctx['vote_url'] = vote_url
        return ctx

class SongVoteCreateView(CreateView):
    form_class = SongVoteForm
    model = Vote

    def get_success_url(self,**kwargs):
        song_id = self.kwargs.get('song_id')
        return reverse('music:song_detail', kwargs={'pk':song_id})

    def form_valid(self, form):
        user = self.request.user
        song_obj = Song.objects.get(pk=self.kwargs['song_id'])
        vote_obj, created = Vote.objects.get_or_create(song = song_obj, user = user) 
        form.instance = vote_obj
        return super(SongVoteCreateView).form_valid(form)

class SongUpdateVoteView(UpdateView):
    form_class = SongVoteForm
    model = Vote

    # def form_valid(self, form):
#     user = self.request.user
#     song_obj = Song.objects.get(pk=self.kwargs['song_id'])
#     vote_obj, created = Vote.objects.get_or_create(song = song_obj, user = user) 
#     form.instance = vote_obj
#     print(form)
#     return super().form_valid(form)

    def get_success_url(self):
        song_id = self.kwargs.get('song_id')
        return reverse('music:song_detail', kwargs={'pk':song_id})

urls.py

отображение URL

    path('album/song/<int:pk>/',views.SongDetailView.as_view(), name='song_detail'),
    path('album/song/create/<int:song_id>/',views.SongVoteCreateView.as_view(), name='song_vote_create'),
    path('album/song/update/<int:song_id>/<int:pk>/', views.SongUpdateView.as_view(), name='song_vote_update')

song_detail. html

Коды на html-странице

 <div>
     <form action="{{vote_url}}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {{ vote_form.as_p }}
            <button class="btn btn-primary" type="submit" >Vote</button>
     </form>
 </div>

forms.py

Код в forms.py

class SongVoteForm(forms.ModelForm):
    like = forms.ChoiceField(widget=forms.RadioSelect,choices=Vote.VALUE_CHOICE)

    class Meta:
        model = Vote
        fields = ['like',]

Код ошибки

ответ получен в консоли.

[31/Oct/2019 04:15:19] "GET /album/song/1/ HTTP/1.1" 200 3560
**[31/Oct/2019 04:15:21] "POST /album/song/update/1/8/ HTTP/1.1" 302 0**
[31/Oct/2019 04:15:21] "GET /album/song/1/ HTTP/1.1" 200 3560

1 Ответ

0 голосов
/ 31 октября 2019

Я явно упомянул как в form_valid в SongVoteCreateView, как показано ниже. Теперь форма не создает пустой объект и перенаправляет на правильную страницу.

def form_valid(self, form):
        like = form.cleaned_data.get('like')
        user = self.request.user
        song_obj = Song.objects.get(pk=self.kwargs['song_id'])
        vote_obj, created = Vote.objects.get_or_create(song = song_obj, user = user, like=like) 
        form.instance = vote_obj
        return super().form_valid(form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...