Кнопка «Мне нравится» в Django не работает должным образом в Django - PullRequest
1 голос
/ 30 октября 2019

Я добавил кнопку «Нравится» и «Не нравится» к записи песни. Когда подобный объект не создается, если какой-либо щелчок по нему, как будто он показывает ошибку интимности, если подобный объект уже существует, он не отображает это в шаблоне.

models.py

Коды в models.py

class Song(models.Model):
    song_title = models.CharField(max_length=25)
    album = models.ForeignKey(Album, related_name='album_name', on_delete=models.CASCADE, blank=True)
    singer = models.ManyToManyField(Singer, blank=True)
    language = models.CharField(max_length=25)

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(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})
            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 SongUpdateView(UpdateView):
    form_class = SongVoteForm
    queryset = Song.objects.all()
    def get_object(self,queryset=None):
        song = super().get_object(queryset)
        user = self.request.user
        return song
    def get_success_url(self):
        song_id = self.kwargs.get('song_id')
        return reverse('music:song_detail', kwargs={'pk':song_id})

class SongVoteCreateView(View):
    form_class = SongVoteForm
    context = {}
    def post(self,request,pk=None,song_id=None):
        vote_obj,created = Vote.objects.get_or_create(pk=pk)
        song_obj = Song.objects.get(pk=song_id)
        vote_form = SongVoteForm(request.POST, instance=vote_obj)
        if vote_form.is_valid():
            new_vote = vote_form.save(commit=False)
            new_vote.user = self.request.user
            new_vote.song = song_obj
            return redirect('/album/')

Song_detail.html

коды в song_detail.html

        <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>

Код ошибки

Это ошибка при отправке кнопки «Мне нравится». Обратитесь сюда для отслеживания

NOT NULL constraint failed: album_vote.song_id

1 Ответ

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

song и user обязательны для заполнения. Таким образом, вы должны указать song и user при создании Vote.

. Вот полный код ::

<code>class SongVoteCreateView(View):
    form_class = SongVoteForm
    context = {}
    def post(self,request,pk=None,song_id=None):
        song_obj = Song.objects.get(pk=song_id)
        <b>vote_obj,created = Vote.objects.get_or_create(song = song_obj, user = request.user)</b> 
        vote_form = SongVoteForm(request.POST, instance=vote_obj)
        if vote_form.is_valid():
            vote_form.save()
            return redirect('/album/')

также в VoteManager, код

return Vote(song=song,user=user)

не будет создавать голосование, вместо этого вы должны использовать

return Vote.objects.create(song=song,user=user)

...