AttributeError После обработки представления - PullRequest
1 голос
/ 30 октября 2019

После отправки данные кнопки «Мне нравится» успешно обновляются в базе данных, но после этого шага они не будут перенаправлены на успешный URL. вместо этого он выбрасывает ошибку атрибута. Если я использую HttpResponseRedirect('/album/') вместо успешного URL, эта ошибка не появляется. Пожалуйста, обратитесь по этой ссылке для отслеживания

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.objects.create(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)
            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(View):
    form_class = SongVoteForm
    context = {}

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

    def post(self,request,pk=None,song_id=None):
        user = self.request.user
        song_obj = Song.objects.get(pk=song_id)
        vote_obj,created = Vote.objects.get_or_create(song = song_obj,user = user) 
        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.save()
            return new_vote

song_detail.html

коды на 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>

код ошибки

пожалуйстасм. эту ссылку для отслеживания

'Vote' object has no attribute 'get'

Ответы [ 2 ]

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

Метод post должен возвращать HttpResponse, а не объект голосования.

Но вы не должны определять post в первую очередь. Весь этот код должен идти в form_valid.

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

Обратите внимание, вам не нужно проверять is_valid, и вам также не нужно устанавливать пользователя, поскольку вы уже сделали этов vote_obj.

1 голос
/ 30 октября 2019

Вы возвращаете Vote объект из post метода в вашем SongVoteCreateView представлении. Вы должны вернуть Response вместо этого. Джанго не знает, что делать с объектом модели, возвращенным из вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...