Представление mainsite.views.winner_detail не возвращало объект HttpResponse. Вместо этого оно вернуло None
Ребята, я схожу с ума.
Я продолжаю получать эту ошибку после обновления формы модели.
Я сделал много таких форм в предыдущих проектах и раньше и никогда не сталкивался с этой проблемой. Я просмотрел все до единого вопросы здесь с той же проблемой и ни к чему не пришел.
это вид
def winner_edit_form(request, pk):
winner = PrizeWinner.objects.get(id=pk)
if request.method == 'POST':
form = WinnerForm(request.POST, instance=winner)
if form.is_valid():
form.save()
return HttpResponseRedirect('winner-details.html', winner.id)
else:
form = WinnerForm(instance=winner)
return render(request,'edit-winner-form.html',{'form': form})
Я пробовал несколько версий этого, включая:
def winner_edit_form(request, pk):
if request.method == 'POST':
winner = PrizeWinner.objects.get(id=pk)
form = WinnerForm(request.POST or None, instance=winner)
if form.is_valid() and request.POST['winner'] != '':
form.save()
return HttpResponseRedirect('winner-detail')
else:
form = WinnerForm(instance=winner)
context = {'winner': winner, 'form': form}
return render(request, 'partials/edit-winner-form.html', context)
Я буквально скопировал и вставил из предыдущих и более сложных проектов и из других примеров и продолжаю получать эту ошибку.
Это мои ссылки
from django.urls import path
from mainsite import views
urlpatterns = [
path('',views.HomePage.as_view(), name='home'),
path("winner-detail/<int:pk>", views.winner_detail, name='winner-detail'),
path("winner-detail/<int:pk>/edit/", views.winner_edit_form, name='winner_edit_form'),
]
models.py
class PrizeWinner(models.Model):
name = models.CharField(max_length=200, blank= False)
prizecode = models.CharField(max_length=120, blank=True)
prizestatus = models.CharField(max_length=200, null=True, blank=True, choices=STATUS_CHOICES, default='Unclaimed')
prizechoices = models.CharField(max_length=200, null= True, blank= True, choices =PRIZE_CHOICES, default='£10 Bar Tab')
date_won = models.DateTimeField(auto_created=True, null=True, blank=True)
comment = models.TextField(null=True, blank=True)
def __str__(self):
return self.name
def pre_save_prize_code(instance, sender, *args, **kwargs):
if not instance.prizecode:
instance.prizecode= unique_prize_code_generator(instance)
pre_save.connect(pre_save_prize_code, sender= PrizeWinner)
Это моя форма
from django import forms
from mainsite.models import PrizeWinner
class WinnerForm(forms.ModelForm):
class Meta:
model = PrizeWinner
fields =('name','prizestatus','prizechoices','comment')
Даже не читая код, я знаю две вещи. (1) Вы отваливаете конец функции представления, не возвращая объект ответа, и (2) вам было бы гораздо лучше отказаться от FBV и использовать представления на основе классов.
OK, теперь ищем ошибку ...
Да, в первой версии, если form.is_valid()
возвращает False, дальнейший код не выполняется и по умолчанию возвращает None.
Однако вторая версия не должна давать таких сбоев. Попробовать еще раз? Какая-то другая ошибка?
Эквивалент CBV. Это только мое мнение, так что оно может содержать ошибки.
class WinnerEditView( UpdateView):
template_name = 'partials/edit-winner-form.html'
context_object_name = 'winner'
model = PrizeWinner
form_class = WinnerForm
success_url = reverse_lazy('winner_detail') # needs an app name?
def form_valid( self, form):
if request.POST['winner'] != '': # I don't understand this, isn't the parsed pk the winner by definition?
form.save()
url
path("winner-detail/<int:pk>/edit/", views.WinnerEditView.as_view(), name='winner_edit_form')