При отправке кнопки после щелчка, как будто она создает объект успешно, но поле «Мне нравится» обновляется с нулевым значением, и 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