Представление 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')
Вернуться на верх