【问题标题】:AttributeError After processing the viewAttributeError 处理完视图
【发布时间】:2019-10-30 10:10:16
【问题描述】:

在提交点赞按钮数据成功更新数据库后,但在此步骤之后它不会重定向到成功的 url。而不是它抛出属性错误。如果我使用 HttpResponseRedirect('/album/') 代替成功的 url,则不会出现此错误。 Please refer this link for the traceback

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>

错误代码

Please refer this link for the traceback

'Vote' object has no attribute 'get'

【问题讨论】:

标签: django python-3.x django-models django-forms django-views


【解决方案1】:

post 方法需要返回一个 HttpResponse,而不是 Vote 对象。

但你不应该首先定义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 中那样设置用户。

【讨论】:

  • Mr.Daniel 感谢您的回答,我已按照您的建议更改了代码,但现在又抛出了另一个错误。 [30/Oct/2019 11:15:15] "POST /album/song_vote_create/1/ HTTP/1.1" 405 0你能帮我解决这个问题吗?
  • 您的 SongCreateView 实际上应该继承自 CreateView,而不是 View。\
【解决方案2】:

您正在从您的SongVoteCreateView 视图中的post 方法返回Vote 对象。你应该返回Response。 Django 不知道如何处理从视图返回的模型对象。

【讨论】:

  • 我已添加 return reverse('music:song_detail', kwargs={'pk':song_id}) 作为响应,但它不起作用。它正在引发另一个像这样的错误'str' object has no attribute 'get'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2019-12-25
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
相关资源
最近更新 更多